如何解决在pyspark中使用arraytype列创建数据框
我正在尝试使用ArrayType()
列创建一个新的数据框,我尝试在没有定义架构的情况下进行尝试,但无法获得所需的结果。我的下面带有模式的代码
from pyspark.sql.types import *
l = [[1,2,3],[3,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,3] |
|[3,4] |
|[6,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',(['whiskers',["names"])
df.show(truncate=False)
这将提供以下输出:
+--------+-----+----+
|names |_2 |_3 |
+--------+-----+----+
|john |sam |jane|
|whiskers|rover|fido|
+--------+-----+----+
解决方法
我认为您已经有了问题的答案。另一个解决方案是:
>>> l = [([1,2,3],),([3,4],([6,8,9],)]
>>> df = spark.createDataFrame(l,['data'])
>>> df.show()
+---------+
| data|
+---------+
|[1,3]|
|[3,4]|
|[6,9]|
+---------+
或
>>> from pyspark.sql.functions import array
>>> l = [[1,[3,[6,9]]
>>> df = spark.createDataFrame(l)
>>> df = df.withColumn('data',array(df.columns))
>>> df = df.select('data')
>>> df.show()
+---------+
| data|
+---------+
|[1,9]|
+---------+
关于奇怪的事情,这并不奇怪,但是您需要记住,具有单个值的元组本身就是单个值
>>> (['john','sam','jane'])
['john','jane']
>>> type((['john','jane']))
<class 'list'>
所以createDataFrame
看到的是列表,而不是元组。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。