Создание фрейма данных со столбцом arraytype в pyspark

#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 ? выделить =кортеж #кортеж