更新的Dataframe列值在配置单元中覆盖失败

tktrz96b  于 2021-05-29  发布在  Spark
关注(0)|答案(1)|浏览(346)

考虑Hive表 tbl 带列 aid 以及 bid ```
| aid | bid |

| | 12 |
| 24 | 13 |
| 18 | 3 |
| | 7 |

要求是什么时候 `aid` 为null或空字符串, `aid` 应被的值覆盖 `bid` ```
|  aid | bid  |
---------------
|  12  |  12  |
|  24  |  13  |
|  18  |   3  |
|   7  |   7  |
---------------

代码很简单

val df01 = spark.sql("select * from db.tbl")
val df02 = df01.withColumn("aid", when(col("aid").isNull || col("aid") <=>  "", col("bid")) otherwise(col("aid")))

跑进去的时候 spark-shell , df02.show 如上表所示显示正确的数据
问题是何时将数据写回配置单元

df02.write
  .format("orc")
  .mode("Overwrite")
  .option("header", "false")
  .option("orc.compress", "snappy")
  .insertInto(tbl)

没有错误,但当我验证数据时

select * from db.tbl where aid is null or aid= '' limit 10;

我仍然可以看到查询返回的多行aid为null
如果以前像上面的例子一样更新列值,如何将数据覆盖回配置单元?

n9vozmp4

n9vozmp41#

我想试试这个

df02.write
  .orc
  .mode(SaveMode.Overwrite)
  .option("compression", "snappy")
  .insertInto(tbl)

相关问题