我需要在Spark中为数据框架创建架构。我可以毫不费力地创建常规StructFields
,例如StringType
,IntegerType
。但是,我想为元组创建StructField
。
我尝试了以下内容:
StructType([StructField("dst_ip", StringType()), StructField("port", StringType())])
然而,它会抛出错误
“list object没有属性'name'”
是否可以为元组类型创建StructField?
答案 0 :(得分:1)
您可以在StructType
内定义StructField
:
schema = StructType(
[
StructField(
"myTuple",
StructType(
[
StructField("dst_ip", StringType()),
StructField("port", StringType())
]
)
)
]
)
df = sqlCtx.createDataFrame([], schema)
df.printSchema()
#root
# |-- myTuple: struct (nullable = true)
# | |-- dst_ip: string (nullable = true)
# | |-- port: string (nullable = true)
答案 1 :(得分:0)
类StructType
(用于定义DataFrame的结构)是表示Row
的数据类型,它由{{的列表 3}}。
要为一列定义一个元组数据类型(例如columnA
),您需要将元组元素的StructType
封装(列出)到StructField
中。请注意,StructField
必须具有名称,因为它们代表列。
将元组StructField
定义为新的StructType
:
columnA = StructField('columnA', StructType([
StructField("dst_ip", StringType()),
StructField("port", StringType())
])
)
定义包含columnA
和columnB
(类型为FloatType
)的架构:
mySchema = StructType([ columnA, StructField("columnB", FloatType())])
将架构应用于数据框:
data =[{'columnA': ('x', 'y'), 'columnB': 1.0}]
# data = [Row(columnA=('x', 'y'), columnB=1.0)] (needs from pyspark.sql import Row)
df = spark.createDataFrame(data, mySchema)
df.printSchema()
# root
# |-- columnA: struct (nullable = true)
# | |-- dst_ip: string (nullable = true)
# | |-- port: string (nullable = true)
# |-- columnB: float (nullable = true)
显示数据框:
df.show()
# +-------+-------+
# |columnA|columnB|
# +-------+-------+
# | [x, y]| 1.0|
# +-------+-------+
(这只是StructField
的较长版本)