PySpark - 如何替换 JSON 文件中的空数组

PySpark - how to replace null array in JSON file

我有 JSON 个包含空数组(array (nullable = true)element: (containsNull = true))的文件,我想将其转换为 parquet 文件。这些空字段会自动删除,而所有其他列都会按预期进行转换。有没有办法用其他东西替换空数组(例如 ["-"])? 我 运行 我在 AWS Glue 中的代码,但替换将使用纯 PySpark 和数据帧进行。

数据类型在 parquet 文件中仍必须是数组(只是不包含空值)。

json:

{
 "a":[],
 "b":[1,2],
 "c": "a string"
}

预期输出:

   a  |   b   |     c
["-"] | [1,2] | "a string"

当前脚本:

sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
spark.conf.set("spark.sql.jsonGenerator.ignoreNullFields", "false")

job = Job(glueContext)
job.init(args['JOB_NAME'], args)

inputDF = glueContext.create_dynamic_frame_from_options(connection_type="s3",
                                                        connection_options:{
                                                             "s3://my-bucket", 
                                                             "recurse":True
                                                           }, 
                                                        format="json")
df = inputDF.toDF()
# replace empty arrays here
dynamic = DynamicFrame.fromDF(df, glueContext, "dynamic")

output = glueContext.write_dynamic_frame.from_options(frame=dynamic,
                                                      connection_type="s3",
                                                      connection_options={
                                                           "path":"s3://my-bucket"
                                                           },
                                                      format="parquet"
                                                      )

不确定您使用的是哪个 spark 版本,我已经检查了 spark 3.1.2 和 2.4.5,其中没有忽略空数组字段。

您可以使用下面的行来获得想要的结果,

df.withColumn('a', when(size('a')== 0, array(lit('-'))).otherwise(col('a'))).show()

+---+------+--------+
|  a|     b|       c|
+---+------+--------+
|[-]|[1, 2]|a string|
+---+------+--------+