Преобразование словаря в фрейм данных в Pyspark

#pyspark #apache-spark-sql

Вопрос:

Описание. Как я могу преобразовать набор данных словаря в фрейм данных в PySpark:

Ошибка/Не ожидаемый результат, который я пытался

 df = spark.createDataFrame([Row(**i) for i in bounds])   

но получите:

Ошибка типа: Не удается вывести схему для типа: lt;class ‘str’gt;

этот код :

 rdd = sc.parallelize(bounds) rdd.map(lambda x: (x,)).toDF().show()  

а другие дают неожиданный результат.

Ожидаемый результат:

введите описание изображения здесь

Мой набор данных:

введите описание изображения здесь

Комментарии:

1. Я уже просмотрел все решения в StackOverflow, но они не помогли. Я новичок в Писпарке.

Ответ №1:

Ваш ввод в createDataFrame() имеет неправильный формат. Это должно выглядеть так —

 [("price", {"q1":1, "q3": 3, "upper": 10, "lower":2} ),   ("carAge", {"q1":1, "q3": 3, "upper": 11, "lower":1})]  

Это список кортежей (список списков также будет работать), где каждый кортеж содержит два элемента: первый-строка, а второй-словарь. Каждый кортеж содержит все данные строк в будущем фрейме данных spark, и два элемента в кортеже означают, что в созданном вами фрейме данных будет 2 столбца.

Чтобы привести данные вашего словаря в приведенный выше формат, используйте эту строку кода:

 [(x, dct[x]) for x in dct.keys()]  

где dct-это ваш исходный словарь, как на изображении моего набора данных. Затем вы можете создать фрейм данных spark следующим образом:

 df = (spark.createDataFrame([(x, dct[x]) for x in dct.keys()],   schema=["Colums", "dct_col"]))  

Этот фрейм данных будет содержать только два столбца, второй столбец «dct_col» будет столбцом словаря, и вы можете получить «q1», «q3» и другие столбцы следующим образом:

 df_expected_result = (df  .withColumn("q1", df.dct_col["q1"])  .withColumn("q3", df.dct_col["q3"])  .withColumn("lower", df.dct_col["lower"])  .withColumn("upper", df.dct_col["upper"]))