У меня есть таблица с именем order вот так:
Что я ожидаю:
Мой код:
SELECT orderId AS id, id AS campaignid, title, type
FROM (
SELECT id AS orderId, inline_outer(from_json(campaigns, 'ARRAY<STRUCT<id: STRING, title: STRING, type: STRING>>'))
FROM order
);
Мне нужно переименовать поле id в orderId в подзапросе, потому что мое поле campaigns содержит ключ id.
Вопрос. Можно ли указать имя столбца, сгенерированное функцией inline_outer в Spark SQL?
Что я пробовал:
SELECT id, inline_outer(from_json(campaigns, 'ARRAY<STRUCT<id: STRING, title: STRING, type: STRING>>')) AS ('campaignId', 'title', 'type')
FROM order;
SELECT id, inline_outer(from_json(campaigns, 'ARRAY<STRUCT<id: STRING, title: STRING, type: STRING>>')) AS {'campaignId', 'title', 'type'}
FROM order;
Однако два приведенных выше метода не соответствуют синтаксису Spark SQL.
Заранее спасибо.
campaigns
это строка или массив структур?
@Steven Да, я хочу использовать Spark SQL или PySpark. campaigns — это строка JSON, поэтому я использовал функцию from_json.
Вам нужно cast вывести from_json и изменить имя столбца:
SELECT
id,
inline_outer(cast(from_json(campaigns, 'ARRAY<STRUCT<id: STRING, title: STRING, type: STRING>>') AS ARRAY<STRUCT<campaignId: STRING, title: STRING, type: STRING>>))
FROM order;
Вот решение, использующее полный pyspark:
from pyspark.sql import functions as F, types as T
# Define schema of the JSON
schema = T.ArrayType(
T.StructType(
[
T.StructField("id", T.StringType()),
T.StructField("title", T.StringType()),
T.StructField("type", T.StringType()),
]
)
)
# OR you can use also this schema with your current example
schema = T.ArrayType(T.MapType(T.StringType(), T.StringType()))
# Convert string to struct
df = df.withColumn(
"campaigns",
F.from_json("campaigns", schema),
)
# Explode the array
df = df.withColumn("campaign", F.explode("campaigns"))
# Rename the field
df = df.select(
"id",
F.col("campaign.id").alias("caimpagnId"),
F.col("campaign.title"),
F.col("campaign.type"),
)
+---+----------+-----+-----+
| id|caimpagnId|title| type|
+---+----------+-----+-----+
| 2| 1| test| one|
| 2| 2|test2| two|
| 5| 3|test3|three|
+---+----------+-----+-----+
Вы уверены, что хотите использовать Spark SQL? было бы проще использовать искровые функции.