python - PySpark SQL 覆盖返回空表
问题描述
我正在迁移表中的一些数据,我正在尝试更改“日期”列的值,但似乎 PySpark 在读取数据时会擦除数据。
我正在执行以下步骤:
- 从表中读取数据
- 更改列的值
- 将数据覆盖到同一张表
当我在这些步骤之后检查数据时,我的表是空的。
这是我的代码
table = "MY_TABLE"
data_input = sqlContext.read.format("jdbc").options(url=JDBCURL, dbtable=table).load()
print("data_input.count()=", data_input.count())
print("'2019' in data_input:", data_input.where(col("date").contains("2019")).count())
print("'YEAR' in data_input:", data_input.where(col("date").contains("YEAR")).count())
# data_input.count()= 1000
# '2019' in data_input: 1000
# 'YEAR' in data_input: 0
data_output = data_input.withColumn("date", F.regexp_replace("date", "2019", "YEAR"))
print("data_output.count()=", data_output.count())
print("'2019' in data_output:", data_output.where(col("date").contains("2019")).count())
print("'YEAR' in data_output:", data_output.where(col("date").contains("YEAR")).count())
# data_output.count()= 1000
# '2019' in data_output: 1000
# 'YEAR' in data_output: 0
到目前为止一切顺利,让我们覆盖表格
df_writer = DataFrameWriter(data_output)
df_writer.jdbc(url = JDBCURL, table=table, mode="overwrite")
# Let's check the data now
print("data_input.count()=", data_input.count())
print("'2019' in data_input:", data_input.where(col("date").contains("2019")).count())
print("'YEAR' in data_input:", data_input.where(col("date").contains("YEAR")).count())
# data_input.count()= 0
# '2019' in data_input: 0
# 'YEAR' in data_input: 0
# huh, weird
print("data_output.count()=", data_output.count())
print("'2019' in data_output:", data_output.where(col("date").contains("2019")).count())
print("'YEAR' in data_output:", data_output.where(col("date").contains("YEAR")).count())
# data_output.count()= 0
# '2019' in data_output: 0
# 'YEAR' in data_output: 0
# Still weird
查询SELECT * FROM MY_TABLE
返回 0 行。
为什么 [Py]Spark 会这样做?我怎样才能改变这种行为?缓存?这在文档中在哪里解释?
解决方案
我通过“缓存”数据框找到了一种解决方法:
data_pandas = data_output.toPandas()
data_spark = spark.createDataFrame(data_pandas)
data_spark.write.jdbc(url=JDBCURL, table=table, mode="overwrite")
推荐阅读
- asp.net-mvc - 如何使用生成器填充列?
- spring - 甚至在请求到达过滤器之前,在 Spring Boot 中返回 400 错误请求
- javascript - Node.js - 如何处理测试文件中的异步模拟?
- r - r markdown - lapply 执行停止
- vue.js - VueJS:@dayclick 函数的 V-Calendar 更改样式
- state - 添加仪表板状态(如入门教程中所述)失败
- javascript - 如果 iteratee 函数返回 false,Lodash forEach 不会迭代整个对象
- python - 使用 Hualos 可视化 Keras 中的训练进度
- apache-kafka - Kafka 到 Google Cloud Platform 数据流提取
- dataset - 向 torchtext 数据集添加一个字段,例如 pandas 数据框中的“应用”函数