Конвертировать столбец строкового типа в struct column в pyspark - PullRequest
0 голосов
/ 03 мая 2019

У меня есть датафрейм с вложенной структурой, так что я точно знаю, что это structType, однако, поскольку он был преобразован из json, он выводит схему в виде строки вместо struct.Я хотел бы, чтобы это оставалось структурным.Как мне подойти к этой проблеме?

В настоящее время кадр данных выглядит следующим образом:

 _________________________________________________________________
|issuingClub |              memberCards                           |
-------------------------------------------------------------------
|  1234      |[{u'createdClub': u'1234', u'cardStatus': u'ACTIVE',| 
             | u'issuedReason': u'new member', u'cardType':       |
             | u'MEMBERSHIPACCOUNT', u'cardNumber':u'109214092'}] |
-------------------------------------------------------------------
| 3712       |[{u'createdClub': u'3712', u'cardStatus': u'EXPIRE',| 
             | u'issuedReason': u'old member', u'cardType':       |
             | u'MEMBERSHIPACCOUNT', u'cardNumber':u'109214092'}] |
-------------------------------------------------------------------

Схема для этого кадра данных выводится как:

 root:
   |-- issuingClub: string (nullable = true)
   |-- memberCards: string (nullable = true)

Вместочленские карты, будучи строкой, я хотел бы преобразовать в StructTypeКак мне это сделать?Пожалуйста, помогите!

Я пытался использовать этот код:

 import json

 def parse_json(array_str):
     json_obj = json.loads(array_str)
     for item in json_obj:
         yield (item["createdClub"],item["cardStatus"],item["issuedReason"],item["cardType"],item["cardNumber"])


from pyspark.sql.types import ArrayType, IntegerType, StructType, StructField
json_schema = ArrayType(StructType([StructField("u'createdClub", StringType(), nullable=False), StructField("u'cardStatus", StringType(), nullable=False),
                                StructField("u'issuedReason", StringType(), nullable=False),
                                StructField("u'cardType",StringType(),nullable=False),
                                StructField("u'cardNumber",StringType(),nullable=False)]))

from pyspark.sql.functions import udf

udf_parse_json = udf(lambda str: parse_json(str), json_schema)

df_new = old_df.select(delta_final_df["issuingClub"], udf_parse_json(delta_final_df["memberCards"]).alias("memberCards"))

Получение этой ошибки в результате этого:

ValueError: Expecting property name enclosed in double quotes: line 1 column 3 (char 2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...