如何使用PySpark将DataFrame中JSON列的数组元素拆分为多行
你需要使用PySpark内置的explode函数对数组类型的number列执行拆行操作,即可实现每个数组元素拆分到独立行、对应id自动重复的效果。
完整实现代码
from pyspark.sql import SparkSession from pyspark.sql.functions import from_json, col, explode from pyspark.sql.types import StructType, StructField, IntegerType, ArrayType, StringType # 初始化SparkSession spark = SparkSession.builder.appName("array_explode_demo").getOrCreate() # 构造测试数据 df = spark.createDataFrame([ ('{"id":10, "number" : ["1.1", "1.2", "1.3"]}',), ('{"id":20, "number" : ["2.1", "2.2", "2.3"]}',), ], schema=["_1"]) # 定义JSON解析的Schema Sch = StructType([ StructField("id", IntegerType(), nullable=True), StructField("number", ArrayType(StringType()), nullable=True) ]) # 解析JSON后拆分数组为多行 result_df = df.withColumn("n", from_json(col("_1"), Sch)) \ .select("n.*") \ .withColumn("number", explode(col("number"))) # 核心拆行代码
你也可以直接在select阶段完成拆行,写法更简洁:
result_df = df.withColumn("n", from_json(col("_1"), Sch)) \ .select(col("n.id"), explode(col("n.number")).alias("number"))
输出结果
执行result_df.show()即可得到你需要的结构:
+---+------+ | id|number| +---+------+ | 10| 1.1| | 10| 1.2| | 10| 1.3| | 20| 2.1| | 20| 2.2| | 20| 2.3| +---+------+
补充说明
如果你的number数组存在空值/空数组的场景,不想让对应id的行被丢弃,可以把explode替换为explode_outer,空数组对应的行number列会显示为null。
内容的提问来源于stack exchange,提问作者ph7274
相关产品推荐
相关产品推荐

