#python #pyspark #apache-spark-sql #pyspark-dataframes
#python #apache-spark-sql #pyspark
Вопрос:
Я пытаюсь создать новый фрейм данных со 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)
Это выдает ошибку:
Ошибка значения: длина объекта (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|
-------- ----- ----
Комментарии:
1. чтобы создать кортеж из одного элемента, добавьте кому в конце.
(['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
образом, он видит список, а не кортеж.
Комментарии:
1. Итак,
createDataframe
для каждой строки берется кортеж, а кортеж обозначается концом,
. Я правильно понял?2. Да, согласно документации, запятая является одним из способов построения кортежа: docs.python.org/3.3/library/stdtypes.html ? выделить =кортеж #кортеж