Pyspark - создает DataFrame из списка списков с полем массива - PullRequest
0 голосов
/ 16 января 2020

Я хочу загрузить некоторые примеры данных, и, поскольку они содержат поле, являющееся массивом, я не могу просто сохранить их как CSV и загрузить файл CSV.

from pyspark.sql.types import *

sample_data = [["prasad, jones",120,"M",[170,50],"brown","1999-10-15T19:50:23+00:00",34,0.1],
["maurice, khan",82,"M",[130,30],"blond","1988-02-01T19:50:23+00:00",67,0.32]]

customSchema = StructType([
  StructField("name", StringType(), True),
  StructField("income", IntegerType(), True),
  StructField("gender", StringType(), True),
  StructField("height_weight", ArrayType(
      StructType([
          StructField("height", IntegerType(), True),
          StructField("weight", IntegerType(), True)
      ]))),
  StructField("hair-color", StringType(), True),
  StructField("dateofbirth", TimestampType(), True),
  StructField("factorX", DoubleType(), True),
  StructField("factorY", DoubleType(), True)
])

# Try #1
df1 = spark.createDataFrame(sample_data,schema=customSchema)
# Try #2
df2 = spark.createDataFrame(spark.sparkContext.parallelize(sample_data),schema=customSchema) 

Я пытался просто создать фрейм данных или распараллелить его перед загрузкой, как было предложено в других похожих вопросах / ответах, но я получаю следующую ошибку:

TypeError: element in array field height_weight: StructType can not accept object 130 in type <class 'int'>

Чего мне не хватает? Или как проще загрузить эти данные? Я пробовал текстовый файл с разделителями табуляции, но spark.read.format('txt') не работал, и я не нашел никакой информации о том, как это сделать.

1 Ответ

0 голосов
/ 16 января 2020

Это потому, что мой ArrayType неверно определен. Это массив целых чисел [int, int], а не массив, содержащий массив целых чисел [[int], [int]].

    customSchema = StructType([
  StructField("name", StringType(), True),
  StructField("income", IntegerType(), True),
  StructField("gender", StringType(), True),
  StructField("height_weight", ArrayType(IntegerType()), True),
  StructField("hair-color", StringType(), True),
  StructField("dateofbirth", StringType(), True),
  StructField("factorX", IntegerType(), True),
  StructField("factorY", DoubleType(), True)
])

Это правильная схема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...