如何在不指定架构的情况下在 PySpark 中使用结构列创建数据框?
How to create dataframe with struct column in PySpark without specifying a schema?
我正在学习 PySpark,能够快速创建示例数据帧来尝试 PySpark 的功能很方便 API。
以下代码(其中 spark
是一个 spark 会话):
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)
但这打字太多了。
是否有任何其他快速创建数据框的方法,以便数据列是一个结构而不指定架构?
我个人不知道您是否可以按照您的意愿隐式创建结构。但是您可以通过首先创建将进入结构的列然后将它们提供给 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)
我正在学习 PySpark,能够快速创建示例数据帧来尝试 PySpark 的功能很方便 API。
以下代码(其中 spark
是一个 spark 会话):
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)
但这打字太多了。
是否有任何其他快速创建数据框的方法,以便数据列是一个结构而不指定架构?
我个人不知道您是否可以按照您的意愿隐式创建结构。但是您可以通过首先创建将进入结构的列然后将它们提供给 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)