我正面临一个基本问题,但令人惊讶的是,我很难找到正确的答案。 也许我搜索不好,这是重复的,我事先表示歉意。
我想做的工作很简单:读取json并将其转换为镶木地板。
df = spark.read.json("path/to/json")
df.write.mode("append").format("parquet").saveAsTable("sc_raw_report")
我有以前工作中已有的实木复合地板文件,并为此创建了一个配置单元metastore。
spark.read.parquet("{}/{}".format("test-data/comparaison", "sc_raw_report")) \
.createOrReplaceTempView("{}_tmp".format("sc_raw_report"))
spark.sql("CREATE TABLE IF NOT EXISTS {0} LIKE {0}_tmp LOCATION '{1}/{0}'".format("sc_raw_report", "test-data/comparaison/parquet"))
spark.sql("DESC {}".format("sc_raw_report"))
现在,我想继续处理原始json,将其转换为镶木地板并追加到此配置单元表中。但是原始的json有时会丢失数据(列),当我尝试执行“ saveAsTAble”时,我碰到“列号与数据模式不匹配”错误。
因此,我想知道如何从json加载,然后按照现有模式保存为镶木地板? 我是否必须手动比较列(有些是嵌套的)并使用.withColumn(col,fn.lit(None))进程创建它们? 还是可以spark自动生成缺少的列并将其设置为null?