Как конвертировать 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
Какое решение я применил::
- записать в текстовый файл
query.write.format("текст").mode('перезаписать'), за исключением ("s3://bucketname/ температуры /").
- читать как JSON
df = spark.read.json ("s3a: // bucketname / temp /")
- Теперь напечатайте схему, это строка 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/")