Преобразование схемы из типа данных String в тип Array (Map (Array)) в Pyspark - PullRequest
0 голосов
/ 21 мая 2019

Мы читаем данные из динамо-базы данных, поэтому получаем тип данных в виде строки, но мы хотим записать тип данных в виде массива (map (array))

Строка данных:

{"policy_details": [{"cdhid": "123", "p2cid": "NA", "roleDesc": "NA", "positionnum": "NA"}, {"cdhid": "1234 "," p2cid ":" NA "," roleDesc ":" NA "," positionnum ":" NA "}]}

Требуется вывод: строковый тип данных необходимо преобразовать в ARRAY(MAP(ARRAY))

Мы попробовали следующую схему:

ArrayType([
    StructField("policy_num", MapType(ArrayType([
        StructField("cdhid", StringType(), True), 
        StructField("role_id", StringType(), True),
        StructField("role_desc", StringType(), True)
    ])))
])

получение ниже вопроса:

elementType [StructField (cdhid, StringType, true), StructField (role_id, StringType, правда), StructField (role_desc, StringType, true)] должен быть экземпляром

1 Ответ

0 голосов
/ 21 мая 2019

Что касается ваших данных, то схема, которую вы хотите, не подходит. Схема ваших данных:

from pyspark.sql import types as T

schm = T.StructType([T.StructField("policy_details",T.ArrayType(T.StructType([ 
        T.StructField("cdhid", T.StringType(), True), 
        T.StructField("p2cid", T.StringType(), True), 
        T.StructField("roleDesc", T.StringType(), True),  
        T.StructField("positionnum", T.StringType(), True), 
    ])), True)])

Тогда вам просто нужно использовать функцию from_json.

from pyspark.sql import functions as F

df.show()                                                                                                         
+--------------------+                                                          
|             db_data|
+--------------------+
|{"policy_details"...|
+--------------------+

new_df = df.select(F.from_json("db_data", schm).alias("data"))

new_df.printSchema()                                                                                              
root
 |-- data: struct (nullable = true)
 |    |-- policy_details: array (nullable = true)
 |    |    |-- element: struct (containsNull = true)
 |    |    |    |-- cdhid: string (nullable = true)
 |    |    |    |-- p2cid: string (nullable = true)
 |    |    |    |-- roleDesc: string (nullable = true)
 |    |    |    |-- positionnum: string (nullable = true)

РЕДАКТИРОВАТЬ : Если вы хотите использовать MapType, вы можете заменить схему на:

schm = T.StructType([
    T.StructField(
        "policy_details",
        T.ArrayType(T.MapType(
            T.StringType(), 
            T.StringType()
        )), 
        True
    )
]) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...