Привет,
Приведенный выше столбец является частью таблицы, с которой я работаю в Databricks. Что я хочу сделать, так это превратить столбец «электронная торговля» в собственную таблицу. В этом случае это означает, что у меня будет новая таблица со столбцами «детали», «продукты» и т. д. В настоящее время "электронная торговля" является типом StringType.
Я пытался использовать создание искрового словаря, табулирование и другие методы, но безуспешно. Код, который у меня есть в настоящее время,
def ecommerce_wtchk_dlt():
df = dlt.read_stream("wtchk_dlt")
ddf = df.select(col("ecommerce"))
header = ddf[0].keys()
rows = [x.values() for x in ddf]
dddf = tabulate.tabulate(rows, header)
return dddf
Всякий раз, когда я пытаюсь принудительно установить тип электронной коммерции как MapType, у меня возникает ошибка, которая говорит, что, поскольку исходный источник данных - StringType, я могу использовать только тот же самый
Я использую блоки данных Azure. Чего я хочу добиться, так это в основном взять столбец изображения выше, а затем создать новую таблицу, которая будет иметь столбцы («деталь», «продукт», «имя»... и т. д.). Я думал о том, чтобы просто использовать манипуляции со строками, но это кажется слишком сложным методом, поэтому я хотел посмотреть, есть ли у меня способ извлекать контент по-другому.
Предоставляйте свои данные в формате кода, а не изображения, которое будет легко воспроизвести.
Пожалуйста, посмотрите, можно ли будет использовать функцию from_json и передать соответствующую схему... Пожалуйста, перейдите по ссылке - Learn.Microsoft.com/en-us/azure/databricks/sql/language-manual/ …
Я воспроизвел вышеизложенное и смог выполнить ваше требование в этом случае, используя from_json
, json_tuple
и explode
.
Это мой образец данных в том же формате, что и ваш.
Код:
from pyspark.sql import functions as F
from pyspark.sql.types import *
df2 = df.select(F.json_tuple(df["ecommerce"],"detail")).toDF("detail") \
.select(F.json_tuple(F.col("detail"),"products")).toDF("products")
print("products : ")
df2.show()
schema = ArrayType(StructType([
StructField("name", StringType()),
StructField("id", StringType()),
StructField("price", StringType()),
StructField("brand", StringType()),
StructField("category", StringType()),
StructField("variant", StringType())
]))
final_df=df2.withColumn("products", F.from_json("products", schema)).select(F.explode("products").alias("products")).select("products.*")
print("Final dataframe : ")
final_df.show()
Мой результат:
какие блоки данных вы используете? лазурь или авс?