Как преобразовать строку json в объект json в pyspark

У меня один из столбцов типа фрейма данных - строка, но на самом деле он содержит объект json из 4-х схем, где несколько полей являются общими. Мне нужно преобразовать это в объект Джейсона.

Вот схема фрейма данных:

query.printSchema()

root
 |-- test: string (nullable = true)

значение DF выглядит как

query.show(10)

+--------------------+
|                test|
+--------------------+
|{"PurchaseActivit...|
|{"PurchaseActivit...|
|{"PurchaseActivit...|
|{"Interaction":{"...|
|{"PurchaseActivit...|
|{"Interaction":{"...|
|{"PurchaseActivit...|
|{"PurchaseActivit...|
|{"PurchaseActivit...|
|{"PurchaseActivit...|
+--------------------+
only showing top 10 rows

Какое решение применил:

  1. записать в текстовый файл

query.write.format("text").mode('overwrite').save("s3://bucketname/temp/")

  1. читать как json

df = spark.read.json("s3a://bucketname/temp/")

  1. теперь распечатайте схему, это строка json для каждой строки, уже преобразованной в объект json

df.printSchema()

root
 |-- EventDate: string (nullable = true)
 |-- EventId: string (nullable = true)
 |-- EventNotificationType: long (nullable = true)
 |-- Interaction: struct (nullable = true)
 |    |-- ContextId: string (nullable = true)
 |    |-- Created: string (nullable = true)
 |    |-- Description: string (nullable = true)
 |    |-- Id: string (nullable = true)
 |    |-- ModelContextId: string (nullable = true)
 |-- PurchaseActivity: struct (nullable = true)
 |    |-- BillingCity: string (nullable = true)
 |    |-- BillingCountry: string (nullable = true)
 |    |-- ShippingAndHandlingAmount: double (nullable = true)
 |    |-- ShippingDiscountAmount: double (nullable = true)
 |    |-- SubscriberId: long (nullable = true)
 |    |-- SubscriptionOriginalEndDate: string (nullable = true)
 |-- SubscriptionChurn: struct (nullable = true)
 |    |-- PaymentTypeCode: long (nullable = true)
 |    |-- PaymentTypeName: string (nullable = true)
 |    |-- PreviousPaidAmount: double (nullable = true)
 |    |-- SubscriptionRemoved: string (nullable = true)
 |    |-- SubscriptionStartDate: string (nullable = true)
 |-- TransactionDetail: struct (nullable = true)
 |    |-- Amount: double (nullable = true)
 |    |-- OrderShipToCountry: string (nullable = true)
 |    |-- PayPalUserName: string (nullable = true)
 |    |-- PaymentSubTypeCode: long (nullable = true)
 |    |-- PaymentSubTypeName: string (nullable = true)

Есть ли лучший способ, когда мне не нужно записывать фрейм данных в виде текстового файла и читать его снова как файл json, чтобы получить ожидаемый результат

Вы пробовали решение в этот ответ или, возможно, этот ответ?

pault 12.04.2018 03:09
2
1
4 049
1

Ответы 1

Вы можете использовать from_json() перед записью в текстовый файл, но сначала вам нужно определить схему.

код выглядит так:

data = query.select(from_json("test",schema=schema).alias("value")).selectExpr("value.*")

data.write.format("text").mode('overwrite').save("s3://bucketname/temp/")

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