pyspark 如何从现有 Dataframe 中的一列创建Spark Dataframe

vsnjm48y  于 2023-02-03  发布在  Spark
关注(0)|答案(2)|浏览(198)

要求:
我想创建一个数据框出一列(现有的数据框)。该列的值是多json列表。
问题:
由于json没有固定的模式,我无法使用from_json函数,因为它在解析列之前需要模式。
示例

| Column A |           Column B             | 
|   1      | [{"id":"123","phone":"124"}]   |
|   3      | [{"id":"456","phone":"741"}]   |

预期产出:

|  id   | phone| 
|  123  | 124  |
|  456  | 741  |

对此有何想法?

5lhxktic

5lhxktic1#

尝试使用SparkSQL分解“B列”数组

from pyspark.sql import SparkSession
from pyspark.sql.types import StructType, StructField, IntegerType, StringType, ArrayType

spark = SparkSession.builder.appName("Test_app").getOrCreate()

input_data = [
    (1, [{"id":"123","phone":"124"}]),
    (3, [{"id":"456","phone":"741"}])
]

schema = StructType([
    StructField("Column A", IntegerType(), True),
    StructField("Column B", ArrayType(StructType([
        StructField("id", StringType(), True),
        StructField("phone", StringType(), True)
    ])), True)
])

df = spark.createDataFrame(input_data, schema)

df_exploded = df.selectExpr("Column A", "explode(Column B) as e") \
                .select("e.id", "e.phone")

df_exploded.show()

输出低于;

+---+-----+
| id|phone|
+---+-----+
|123|  124|
|456|  741|
+---+-----+
0ejtzxu1

0ejtzxu12#

将其转换为一个rdd,然后读取为json。为了测试,我删除了第二行中的id元素。

input_data = [
    (1, [{"id":"123","phone":"124"}]),
    (3, [{"phone":"741"}])
]
df = spark.createDataFrame(input_data, ["ColA","ColB"])
spark.read.json(df.rdd.map(lambda r: r.ColB)).show()
+----+-----+
|  id|phone|
+----+-----+
| 123|  124|
|null|  741|
+----+-----+

相关问题