Есть ли способ указать имя столбца, сгенерированное функцией inline_outer в Spark SQL?

У меня есть таблица с именем order вот так:

идентификатор кампании 2 [{"id": "1", "title": "тест", "type": "один"}, {"id": "2", "title": "test2", "type": "два "}] 5 [{"id": "3", "title": "test3", "type": "три"}]

Что я ожидаю:

идентификатор идентификатор кампании заголовок тип 2 1 тест один 2 2 тест2 два 5 3 тест3 три

Мой код:

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.

Заранее спасибо.

Вы уверены, что хотите использовать Spark SQL? было бы проще использовать искровые функции.

Steven 13.02.2023 11:08
campaigns это строка или массив структур?
Steven 13.02.2023 11:09

@Steven Да, я хочу использовать Spark SQL или PySpark. campaigns — это строка JSON, поэтому я использовал функцию from_json.

Guoran Yun 13.02.2023 13:28
Конечные и Readonly классы в PHP
Конечные и Readonly классы в PHP
В прошлом, когда вы не хотели, чтобы другие классы расширяли определенный класс, вы могли пометить его как final.
От React к React Native: Руководство для начинающих по разработке мобильных приложений с использованием React
От React к React Native: Руководство для начинающих по разработке мобильных приложений с использованием React
Если вы уже умеете работать с React, создание мобильных приложений для iOS и Android - это новое приключение, в котором вы сможете применить свои...
БЭМ: Конвенция об именовании CSS
БЭМ: Конвенция об именовании CSS
Я часто вижу беспорядочный код CSS, особенно если проект большой. Кроме того, я совершал эту ошибку в профессиональных или личных проектах и...
Революционная веб-разработка ServiceNow
Революционная веб-разработка ServiceNow
В быстро развивающемся мире веб-разработки ServiceNow для достижения успеха крайне важно оставаться на вершине последних тенденций и технологий. По...
Как добавить SEO(Search Engine Optimization) в наше веб-приложение и как это работает?
Как добавить SEO(Search Engine Optimization) в наше веб-приложение и как это работает?
Заголовок веб-страницы играет наиболее важную роль в SEO, он помогает поисковой системе понять, о чем ваш сайт.
Конфигурация Jest в angular
Конфигурация Jest в angular
В этой статье я рассказываю обо всех необходимых шагах, которые нужно выполнить при настройке jest в angular.
0
3
63
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вам нужно 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|
+---+----------+-----+-----+

Другие вопросы по теме