我想使用以下格式从PySpark SQL数据框中解析并获取特定键的值
我可以使用UDF来实现这一点,但是处理JSON大小为100MB的40列大约需要20分钟。尝试也爆炸,但它为每个数组元素提供了单独的行。但是我只需要给定结构数组中键的特定值即可。
格式
array<struct<key:string,value:struct<int_value:string,string_value:string>>>
def getValueFunc(searcharray, searchkey):
for val in searcharray:
if val["key"] == searchkey:
if val["value"]["string_value"] is not None:
actual = val["value"]["string_value"]
return actual
elif val["value"]["int_value"] is not None:
actual = val["value"]["int_value"]
return str(actual)
else:
return "---"
.....
getValue = udf(getValueFunc, StringType())
....
# register the name rank udf template
spark.udf.register("getValue", getValue)
.....
df.select(getValue(col("event_params"), lit("category")).alias("event_category"))
答案 0 :(得分:0)
对于Spark 2.40+,可以使用SparkSQL的filter()函数查找与key == serarchkey
匹配的第一个数组元素,然后检索其值。下面是用于执行上述第一部分的Spark SQL代码段模板( searchkey 作为变量)。
stmt = '''filter(event_params, x -> x.key == "{}")[0]'''.format(searchkey)
使用expr()
函数运行上述 stmt ,并将值( StructType )分配给临时列f1
,然后使用{ {1}}函数可检索非空值。
coalesce()
让我知道您是否在运行上述代码时遇到任何问题。