是否可以使用PySpark创建元组类型的StructField?

时间:2018-04-20 17:49:38

标签: pyspark

我需要在Spark中为数据框架创建架构。我可以毫不费力地创建常规StructFields,例如StringTypeIntegerType。但是,我想为元组创建StructField

我尝试了以下内容:

StructType([StructField("dst_ip", StringType()), StructField("port", StringType())])

然而,它会抛出错误

  

“list object没有属性'name'”

是否可以为元组类型创建StructField?

2 个答案:

答案 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())
                                             ])
                     )

定义包含columnAcolumnB(类型为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的较长版本)