在pyspark中创建一个包含单列元组的数据框

时间:2016-07-08 09:51:06

标签: apache-spark dataframe pyspark apache-spark-sql

我的RDD包含以下[('第1列',值),('第2列',值),('第3列' ,value),...,('第100列',值)]。 我想创建一个包含带有元组的单个列的数据框。

我最接近的是:

schema = StructType((StructField("char", StringType(), False), (StructField("count", IntegerType(), False))))
    my_udf = udf(lambda w, c: (w,c), schema)

然后

df.select(my_udf('char', 'int').alias('char_int'))

但这会生成一个包含列列的数据框,而不是元组。

1 个答案:

答案 0 :(得分:1)

struct是在Spark SQL中表示产品类型(如tuple)的正确方法,这正是您使用代码所获得的:

df = (sc.parallelize([("a", 1)]).toDF(["char", "int"])
    .select(my_udf("char", "int").alias("pair")))
df.printSchema()

## root
##  |-- pair: struct (nullable = true)
##  |    |-- char: string (nullable = false)
##  |    |-- count: integer (nullable = false)

除非你想创建一个UDT(2.0.0中不再支持)或将pickle对象存储为BinaryType,否则没有其他方法来表示元组。

此外,struct字段在本地表示为tuple

isinstance(df.first().pair, tuple)
## True

我猜你拨打show时可能会被方括号弄糊涂:

df.show()

## +-----+
## | pair|
## +-----+
## |[a,1]|
## +-----+

它只是JVM对应部分的选择表示,并不表示Python类型。