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|
+---+------+--------+
我有 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|
+---+------+--------+