pyspark(spark 2.4)+配置单元原始json与表模式相比缺少列

时间:2019-10-03 15:54:22

标签: apache-spark hive pyspark pyspark-sql

我正面临一个基本问题,但令人惊讶的是,我很难找到正确的答案。 也许我搜索不好,这是重复的,我事先表示歉意。

我想做的工作很简单:读取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?

0 个答案:

没有答案