gpt4 book ai didi

apache-spark - 如何在不指定架构的情况下在 PySpark 中使用结构列创建数据框?

转载 作者:行者123 更新时间:2023-12-05 02:29:44 24 4
gpt4 key购买 nike

我正在学习 PySpark,能够快速创建示例数据框来尝试 PySpark API 的功能很方便。

以下代码(其中 spark 是一个 spark session ):

import pyspark.sql.types as T
df = [{'id': 1, 'data': {'x': 'mplah', 'y': [10,20,30]}},
{'id': 2, 'data': {'x': 'mplah2', 'y': [100,200,300]}},
]
df = spark.createDataFrame(df)
df.printSchema()

给出一个映射(并没有正确解释数组):

root
|-- data: map (nullable = true)
| |-- key: string
| |-- value: string (valueContainsNull = true)
|-- id: long (nullable = true)

我需要一个结构。如果我给出一个模式,我可以强制一个结构:

import pyspark.sql.types as T
df = [{'id': 1, 'data': {'x': 'mplah', 'y': [10,20,30]}},
{'id': 2, 'data': {'x': 'mplah2', 'y': [100,200,300]}},
]
schema = T.StructType([
T.StructField('id', LongType()),
T.StructField('data', StructType([
StructField('x', T.StringType()),
StructField('y', T.ArrayType(T.LongType())),
]) )
])
df = spark.createDataFrame(df, schema=schema)
df.printSchema()

这确实给出了:

root
|-- id: long (nullable = true)
|-- data: struct (nullable = true)
| |-- x: string (nullable = true)
| |-- y: array (nullable = true)
| | |-- element: long (containsNull = true)

但这打字太多了。

是否有任何其他快速创建数据框的方法,以便数据列是一个结构而不指定模式?

最佳答案

创建示例数据框时,您可以使用转换为 Spark 结构的 Python 元组。但是这样你就不能指定结构域名称了。

df = spark.createDataFrame(
[(1, ('mplah', [10,20,30])),
(2, ('mplah2', [100,200,300]))],
['id', 'data']
)
df.printSchema()
# root
# |-- id: long (nullable = true)
# |-- data: struct (nullable = true)
# | |-- _1: string (nullable = true)
# | |-- _2: array (nullable = true)
# | | |-- element: long (containsNull = true)

使用这种方法,您可能想要添加架构:

df = spark.createDataFrame(
[(1, ('mplah', [10,20,30])),
(2, ('mplah2', [100,200,300]))],
'id: bigint, data: struct<x:string,y:array<bigint>>'
)
df.printSchema()
# root
# |-- id: long (nullable = true)
# |-- data: struct (nullable = true)
# | |-- x: string (nullable = true)
# | |-- y: array (nullable = true)
# | | |-- element: long (containsNull = true)

但是,我通常更喜欢使用 struct 的方法.这种方式不提供详细架构,结构字段名称取自列名称。

from pyspark.sql import functions as F
df = spark.createDataFrame(
[(1, 'mplah', [10,20,30]),
(2, 'mplah2', [100,200,300])],
['id', 'x', 'y']
)
df = df.select('id', F.struct('x', 'y').alias('data'))

df.printSchema()
# root
# |-- id: long (nullable = true)
# |-- data: struct (nullable = false)
# | |-- x: string (nullable = true)
# | |-- y: array (nullable = true)
# | | |-- element: long (containsNull = true)

关于apache-spark - 如何在不指定架构的情况下在 PySpark 中使用结构列创建数据框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72078447/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com