#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"]))