在pyspark中创建带有arraytype列的数据框
Posted
技术标签:
【中文标题】在pyspark中创建带有arraytype列的数据框【英文标题】:Create dataframe with arraytype column in pyspark 【发布时间】:2020-09-24 07:32:16 【问题描述】:我正在尝试使用 ArrayType()
列创建一个新的数据框,我尝试了定义架构和不定义架构,但无法获得所需的结果。我下面的代码带有架构
from pyspark.sql.types import *
l = [[1,2,3],[3,2,4],[6,8,9]]
schema = StructType([
StructField("data", ArrayType(IntegerType()), True)
])
df = spark.createDataFrame(l,schema)
df.show(truncate = False)
这给出了错误:
ValueError: 对象 (3) 的长度与字段的长度不匹配 (1)
期望的输出:
+---------+
|data |
+---------+
|[1,2,3] |
|[3,2,4] |
|[6,8,9] |
+---------+
编辑:
我发现了一件奇怪的事情(至少对我来说):
如果我们使用下面的代码,它会给出预期的结果:
import pyspark.sql.functions as f
data = [
('person', ['john', 'sam', 'jane']),
('pet', ['whiskers', 'rover', 'fido'])
]
df = spark.createDataFrame(data, ["type", "names"])
df.show(truncate=False)
这给出了以下预期输出:
+------+-----------------------+
|type |names |
+------+-----------------------+
|person|[john, sam, jane] |
|pet |[whiskers, rover, fido]|
+------+-----------------------+
但是如果我们删除第一列,那么它会给出意想不到的结果。
import pyspark.sql.functions as f
data = [
(['john', 'sam', 'jane']),
(['whiskers', 'rover', 'fido'])
]
df = spark.createDataFrame(data, ["names"])
df.show(truncate=False)
这给出了以下输出:
+--------+-----+----+
|names |_2 |_3 |
+--------+-----+----+
|john |sam |jane|
|whiskers|rover|fido|
+--------+-----+----+
【问题讨论】:
要创建一个具有单个元素的元组,请在末尾添加一个逗号。(['john', 'sam', 'jane'],)
逗号构成元组,而不是括号。 1,
是一个元组。
【参考方案1】:
我想你已经有了问题的答案。另一种解决方案是:
>>> l = [([1,2,3],), ([3,2,4],),([6,8,9],)]
>>> df = spark.createDataFrame(l, ['data'])
>>> df.show()
+---------+
| data|
+---------+
|[1, 2, 3]|
|[3, 2, 4]|
|[6, 8, 9]|
+---------+
或
>>> from pyspark.sql.functions import array
>>> l = [[1,2,3],[3,2,4],[6,8,9]]
>>> df = spark.createDataFrame(l)
>>> df = df.withColumn('data',array(df.columns))
>>> df = df.select('data')
>>> df.show()
+---------+
| data|
+---------+
|[1, 2, 3]|
|[3, 2, 4]|
|[6, 8, 9]|
+---------+
关于奇怪的事情,这并不奇怪,但你需要记住,具有单个值的元组就是单个值本身
>>> (['john', 'sam', 'jane'])
['john', 'sam', 'jane']
>>> type((['john', 'sam', 'jane']))
<class 'list'>
所以createDataFrame
看到的是列表而不是元组。
【讨论】:
所以,createDataframe
为每一行获取元组,一个元组由结尾 ,
表示。我做对了吗?
是的,根据文档,逗号是构造元组的一种方法:docs.python.org/3.3/library/stdtypes.html?highlight=tuple#tuple以上是关于在pyspark中创建带有arraytype列的数据框的主要内容,如果未能解决你的问题,请参考以下文章
使用带有 Spark 版本 2.2 的 row_number() 函数在 PySpark DataFrame 中创建每一行的行号
如何在 Pyspark Dataframe 中创建多列的所有成对组合?
在 PySpark 中将 ArrayType(StringType()) 的列转换为 ArrayType(DateType())