我们正在从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)]应该是
的实例
答案 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
)
])