PySpark解析结构的嵌套数组

时间:2019-10-06 19:00:07

标签: pyspark pyspark-sql

我想使用以下格式从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"))

1 个答案:

答案 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()

让我知道您是否在运行上述代码时遇到任何问题。