在Pyspark中将模式从String数据类型转换为Array(Map(Array))数据类型

时间:2019-05-21 07:20:54

标签: dataframe pyspark schema pyspark-sql

我们正在从dynamo db读取数据,因此我们将数据类型作为字符串获取,但是我们想将字符串数据类型写入为array(map(array))

字符串数据:

  

{“ policy_details”:[{“ cdhid”:“ 123”,“ p2cid”:“ NA”,“ roleDesc”:“ NA”,“ positionnum”:“ NA”},{“ cdhid”:“ 1234 “,” p2cid“:”不适用“,” roleDesc“:”不适用“,” positionnum“:”不适用“}]}

必需的输出: 字符串数据类型需要转换为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,true),   StructField(role_desc,StringType,true)]应该是

的实例

1 个答案:

答案 0 :(得分:0)

关于您的数据,所需的架构不是适合的架构。 您的数据架构为:

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
    )
])