Учитывая df1:
Как создать дф2:
Вопрос: Используя pyspark
, если у нас есть фрейм данных df1
(показан выше), как мы можем создать фрейм данных df2
, который содержит имена столбцов df1
в первом столбце и значения df1
во втором втором столбце?
ПРИМЕЧАНИЯ: Обратите внимание, что df1
будет динамическим, он будет меняться в зависимости от загруженных в него данных. Как показано ниже, я уже знаю, как это сделать, если df1
является статическим:
data = [['c1', 45], ['c2', 15], ['c3', 100]]
mycolumns = ["myCol1","myCol2"]
df = spark.createDataFrame(data, mycolumns)
df.show()
Для статического df1 приведенный выше код покажет df2 как:
|myCol1|myCol2|
|---|---|
|c1|45|
|c2|15|
|c3|100|
Попробуй это -
from pyspark.sql.functions import *
data = [["java", "dbms", "python"]]
columns = ["Subject 1", "Subject 2", "Subject 3"]
df1 = spark.createDataFrame(data, columns)
column_names = df1.columns
stacked = df1.selectExpr("stack(" + str(len(column_names)) + "," + ",".join([f"'{col}', `{col}`" for col in column_names]) + ") as (columnName, columnValue)")
df2 = stacked.selectExpr("columnName", "columnValue")
df2.show()
+----------+----------------+
|columnName| columnValue|
+----------+----------------+
| Subject 1| java|
| Subject 2| dbms|
| Subject 3| python|
+----------+----------------+
Я создал df1
, используя ваши входные данные, и это сработало для меня. Можете ли вы опубликовать полное сообщение об ошибке? Также, если возможно, как вы создали df1
. Я также использовал Databricks здесь.
Сообщение об ошибке: /databricks/spark/python/pyspark/sql/dataframe.py в selectExpr(self, *expr) 1841, если len(expr) == 1 и isinstance(expr[0], list): 1842 expr = expr [0] -> 1843 jdf = self._jdf.selectExpr(self._jseq(expr)) 1844 return DataFrame(jdf, self.sql_ctx) /databricks/spark/python/lib/py4j-0.10.9.1-src.zip/ py4j/java_gateway.py в __call__(self, *args) 1303 answer = self.gateway_client.send_command(command) -> 1304 return_value = get_return_value( 1305 answer, self.gateway_client, self.target_id, self.name)`
Я использовал этот пример: data = [["java", "dbms", "python"], ["OOPS", "SQL", "Machine Learning"]] columns = ["Subject 1", "Subject 2", "Subject 3"] df1 = spark.createDataFrame(data, columns)
Отредактировал мой ответ, чтобы поддержать пограничный случай.
Я уже проголосовал. Не могли бы вы удалить одну строку в примере, который я вам привел. В противном случае это не будет иметь отношения к вопросу, где я говорю как one row dataframe df1
. Пример может сбить с толку читателей этого поста, так как он состоит из двух строк и из-за этого имена столбцов повторяются в df2. Вы также можете переписать отображение df2 только с 3 строками. И я приму ответ. Спасибо за помощь мне.
Получаю
ParseException
на второй строчкеstacked = .....
. Я запускаю блокнот вDatabricks
.