PySpark递归密钥搜索

时间:2018-06-14 15:25:49

标签: python json pyspark

我有一个深层嵌套的json esque结构,我需要在所有级别(最多7个)搜索所有出现的给定键。在级别0中始终存在数据,我需要将其与在任何级别找到的search_key的每次出现相关联。我已经尝试通过递归调用推送这些数据并在返回时附加它,但是当我将它从标准Python移动到PySpark RDD时,我遇到了堆和不可用的类型问题。

我的搜索功能如下:

def search(input, search_key, results):

    if input:
        for i in input:
            if isinstance(i, list):
                search(i, search_key, results)

            elif isinstance(i, dict):
                for k, v in i.iteritems():
                    if k == search_key:
                        results.append(i)
                        continue
                    elif isinstance(v, list):
                        search(v, search_key, results)
                    elif isinstance(v, dict):
                        search(v, search_key, results)

        return results

我一直在说:

origin_rdd = sc.parallelize(origin)
concept_lambda = lambda c: search(c, term, [])
results = origin_rdd.flatMap(concept_lambda)

有人能建议一种方法来捕获顶级数据并将其作为结果中每个对象的一部分吗?结果可以是0到n,因此7个键的乘积总是出现在顶层,然后是所有出现的搜索词集合。然后,我想将生成的RDD中的每一行转换为PySpark Row,以便与PySpark DataFrame一起使用。我没有找到一个好的方法来开始使用DataFrame而不是RDD或将搜索功能应用于DataFrame列,因为该结构在其架构中是高度动态的,但是如果有人认为这是更好的路线,我很高兴听到建议。

1 个答案:

答案 0 :(得分:0)

当我受到搜索的热议时,我可以通过使用Deepcopy进行切片和传递基础来解决我的问题。其他尝试做类似事情的人可能会调整下面的内容。

origin_rdd = sc.parallelize(origin)
concept_lambda = lambda r: search(r[-1], r[0:9], term, [])
results = origin_rdd.flatMap(concept_lambda)

搜索功能

def search(input, row_base, search_key, results):    
    if input:
        for i in input:
            if isinstance(i, list):
                search(i, row_base, search_key, results)
            if isinstance(i, dict):
                for k, v in iteritems(i):
                    if k == search_key:
                        row = copy.deepcopy(row_base)
                        row.append(i)
                        results.append(row)
                        continue
                    elif isinstance(v, list):
                        search(v, row_base, search_key, results)
                    elif isinstance(v, dict):
                        search(v, row_base, search_key, results)

    return results