Как конвертировать JSON String в объект 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("текст").mode('перезаписать'), за исключением ("s3://bucketname/ температуры /").

  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)

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

0 ответов

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

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

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

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

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