![](/img/trans.png)
[英]How to Concat 2 column of ArrayType on axis = 1 in Pyspark dataframe?
[英]Create dataframe with arraytype column in pyspark
我正在嘗試使用ArrayType()
列創建一個新的數據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|
+--------+-----+----+
我想你已經有了問題的答案。 另一種解決方案是:
>>> 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
看到的是一個列表而不是元組。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.