Как отключить фрейм данных с помощью SQL-запроса в Azure Databricks (Pyspark)

Итак, я создал временную таблицу из фрейма данных pyspark с помощью registerTempTable (). В таблице есть данные, подобные следующим:

 ________________________________________________
|  Name   |    Groceries    |  Gadgets  |  Rent  |
|------------------------------------------------|
| John    |      10         |    15     |   20   |
| Henry   |      12         |    35     |   18   |
| Mark    |      15         |     5     |   10   |
--------------------------------------------------

Я хотел бы отключить три столбца Продовольственные товары, Гаджеты и Аренда и получить таблицу, как показано ниже:

-------------------------------------------
|  Name    |    Spend_Type     | Spend    |
-------------------------------------------
| John     | Groceries         | 10       |
| John     | Gadgets           | 15       |
| John     | Rent              | 20       |
| Henry    | Groceries         | 12       |
| Henry    | Gadgets           | 35       |
| Henry    | Rent              | 18       |
| Mark     | Groceries         | 15       |
| Mark     | Gadgets           |  5       |
| Mark     | Rent              | 10       |   
------------------------------------------

Я написал код Pyspark как

//imported all necessary libraries
query = '''select * from mytable UNPIVOT (Spend FOR Spend_Type in ("Groceries" , "Gadgets", "Rent" ))'''
df_view1 = sqlContext.sql(query)

Но Ablve дает мне ошибку

org.apache.spark.sql.catalyst.parser.ParseException:
.
.
.
ParseException: '
mismatched input 'from' expecting EOF
.
.

Может кто-нибудь сказать мне, что я делаю не так? Обратите внимание, что «Выбрать * из mytable» и даже команда Pivot работает.

Всего 2 ответа


Используя функцию stack :

expr = "stack({nb}, {content}) as (Spend_Type, Spend)".format(
    content=",".join(
        ["'{col}', {col}".format(col=col) for col in df.columns if col != "Name"]
    ),
    nb=len(df.columns) - 1,
)

df.selectExpr("name", expr).show() 

+-----+----------+-----+
| name|Spend_Type|Spend|
+-----+----------+-----+
| John| Groceries|   10|
| John|   Gadgets|   15|
| John|      Rent|   20|
|Henry| Groceries|   12|
|Henry|   Gadgets|   35|
|Henry|      Rent|   18|
| Mark| Groceries|   15|
| Mark|   Gadgets|    5|
| Mark|      Rent|   10|
+-----+----------+-----+

>>> from pyspark.sql.functions import *
>>> df.show()
+-----+---------+-------+----+
| Name|Groceries|Gadgets|Rent|
+-----+---------+-------+----+
| John|       10|     15|  20|
|Henry|       12|     35|  18|
| Mark|       15|      5|  10|
+-----+---------+-------+----+

>>> df.withColumn("temp", explode(split(regexp_replace(to_json(struct(col("Groceries"),col("Gadgets"),col("Rent"))), """[{"}]""", ""), ",")))
      .withColumn("Spend_Type", split(col("temp"), ":")[0])
      .withColumn("Spend", split(col("temp"), ":")[1]).select(col("Name"), col("Spend_Type"), col("Spend")).show()
+-----+----------+-----+
| Name|Spend_Type|Spend|
+-----+----------+-----+
| John| Groceries|   10|
| John|   Gadgets|   15|
| John|      Rent|   20|
|Henry| Groceries|   12|
|Henry|   Gadgets|   35|
|Henry|      Rent|   18|
| Mark| Groceries|   15|
| Mark|   Gadgets|    5|
| Mark|      Rent|   10|
+-----+----------+-----+

Есть идеи?

10000