您是否尝试过强制架构?
您可以试试这个,因为显然每个文件中都有不同的架构,因此执行正确的架构应该可以解决您的问题:
from pyspark.sql import types as T
schema = T.StructType(
[
T.StructField("b_key", T.IntegerType()),
T.StructField("b_code", T.StringType()),
T.StructField(
"r_date",
T.StructType(
[
T.StructField("s_key", T.IntegerType()),
T.StructField("s_code", T.StringType()),
T.StructField(
"products",
T.StructType(
[
T.StructField("s_key", T.IntegerType()),
T.StructField("s_key", T.IntegerType()),
T.StructField("s_code", T.StringType()),
T.StructField("s_type", T.StringType()),
T.StructField("r_type", T.StringType()),
T.StructField("sl", T.DecimalType()),
T.StructField("sp", T.IntegerType()),
]
),
),
]
),
),
]
)
df = spark.read.json("path/to/file.json", schema=schema)
从那里,你没有任何数组,所以你可以简单地select 嵌套列来展平。例如:
df.selct(
"r_data.*"
)
这将使 r_data 结构列变平,最终得到 3 列。