使用变量模式创建pysparkDataframe

e0bqpujr  于 2021-05-27  发布在  Spark
关注(0)|答案(2)|浏览(322)

我想创建一个pysparkDataframe,其中有一个带有变量schema的列。所以我的数据框可以是这样的:

| Id | Variable_Column                  |
|----|----------------------------------|
| 1  | [{"col1":"val1"}]                |
| 2  | [{"col1":"val2", "col2":"val3"}] |

所以要做到这一点。我开始是这样的:

schema = StructType([StructField("Id", IntegerType(), True),\
                      StructField("Variable_Column", ArrayType(StructType()), True)\
                               ])
valdict = dict()
valdict["col1"] = "val1"
values = [(1, [valdict])]
df = spark.createDataFrame(values, schema)
display(df)

| Id | Variable_Column |
|----|-----------------|
| 1  | [{}]            |

这样做就是创建一个空数组。而且这感觉不对,我希望内部列的类型也被保留。请建议插入数据的正确方法。对于变量列,我使用“ ArrayType(StructType()) ,这是要使用的列类型吗?

rjee0c15

rjee0c151#

您可以按以下方式定义架构:

schema = StructType([StructField("Id", IntegerType(), True),\
                      StructField("Variable_Column", ArrayType(MapType(StringType(),StringType())), True)\
                                ])

这将产生如下输出:

df.show()
+---+--------------------+
| Id|     Variable_Column|
+---+--------------------+
|  1|[[col2 -> val3, c...|
+---+--------------------+
dxpyg8gm

dxpyg8gm2#

解决方案1
如果您只想创建一个值数目可变的列,可以使用 ArrayTypeStructType . 在你的例子中,你定义了一个空的 StructType ,从而得到结果。
您可以这样定义Dataframe:

df1 = spark.createDataFrame([ (1, [('name1', 'val1'), ('name2', 'val2')]),
                              (2, [('name3', 'val3')])],
           ['Id', 'Variable_Column'])
df1.show(truncate=False)

与您提供的示例相对应:

+---+----------------------------+
|Id |Variable_Column             |
+---+----------------------------+
|1  |[[name1,val1], [name2,val2]]|
|2  |[[name3,val3]]              |
+---+----------------------------+

请注意,在这种情况下不需要显式定义模式,但如果需要,它将如下所示(顺便说一下,您可以调用df1.schema来打印它):

schema = StructType([
             StructField('Id',LongType()),
             StructField('Variable_Column',ArrayType(StructType([
                   StructField('name',StringType()),
                   StructField('value',StringType())
             ])))
         ])

解决方案2
同样地,你可以使用 MapType 键入以下内容:

df2 = spark.createDataFrame([ (1, dict([('name1', 'val1'), ('name2', 'val2')])), 
                              (2, dict([('name3', 'val3')]) )
              ], ['Id', 'Variable_Column'])
df2.show(truncate=False)
+---+---------------------------------+
|Id |Variable_Column                  |
+---+---------------------------------+
|1  |Map(name2 -> val2, name1 -> val1)|
|2  |Map(name3 -> val3)               |
+---+---------------------------------+

解决方案3
在注解中,您说您还需要变量类型。这在Dataframe中是不可能的。如果这真的是你想要的,你可能没有使用正确的工具。但如果它只是一个角大小写,您可以将数据类型的记录保存在如下字符串中:

df3 = spark.createDataFrame([ (1, [('name1', 'val1', 'string'),
                                   ('name2', '0.6', 'double')]),
                              (2, [('name3', '3', 'integer')])],
           ['Id', 'Variable_Column'])
df3.show(truncate=False)
+---+-----------------------------------------+
|Id |Variable_Column                          |
+---+-----------------------------------------+
|1  |[[name1,val1,string], [name2,0.6,double]]|
|2  |[[name3,3,integer]]                      |
+---+-----------------------------------------+

相关问题