python - 如何在 PySpark 中进行嵌套转换

标签 python lambda nested pyspark map-function

这是我的数据示例:

data1 = [[ 'red blue hi you red' ],
     [ 'ball green ball go four ball'],
     [ 'nice red start nice' ],
     [ 'ball no kill tree go go' ]]

从之前的数据中得到以下信息:

data2 = 
[[[ 'red', 2 ], [ 'blue', 1 ], [ 'hi', 1 ], [ 'you', 1 ]],
[[ 'green', 1 ], [ 'go', 1 ], [ 'four', 1 ], [ 'ball', 3 ]],
[[ 'red, 1 ], [ 'start', 1 ], [ 'nice', 2 ]],
[[ 'ball', 1 ], [ 'no', 1 ], [ 'kill', 1 ], [ 'tree', 1 ], [ 'go', 2 ]]]

注意:请注意,RDD data2 具有嵌套列表,其中包含该单词在 RDD data1 中的每个元素中被提及的次数 我想要的是应用以下代码:

data3 = data2.map(lambda x: [data1.filter(lambda z: y[0] in z) for y in x])

输出应该是包含给定单词的 data1 中的列表或元素。 例如:如果单词“red”传递到循环然后过滤,它应该给我 data1 中的 2 个列表,它们是:

[ 'red blue hi you red' ]
[ 'nice red start nice' ]

但它一直给出以下错误:

异常:您似乎正在尝试广播 RDD 或从操作或转换引用 RDD。 RDD 转换和操作只能由驱动程序调用,不能在其他转换内部调用;例如,rdd1.map(lambda x: rdd2.values.count() * x) 无效,因为值转换和计数操作无法在 rdd1.map 转换内部执行。有关详细信息,请参阅 SPARK-5063。

我尝试采用另一种方法,即定义一个函数,然后将其传递到转换映射中,例如:

def func(y)
    data1.filter(lambda z: y[0] in z)
data3 = data2.map(lambda x: [ func(y) for y in x])

但它仍然是同样的错误,显然试图变得聪明是行不通的:3 我能做些什么?提前致谢。

最佳答案

答案很简短而且相当明确:你不能。 Spark 不支持而且很可能不会支持分布式数据结构上的嵌套操作。根据上下文,您可以将它们替换为具有本地(可选广播)数据结构的 joinmap

关于python - 如何在 PySpark 中进行嵌套转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36673489/

相关文章:

jQuery getJSON : getting clicked 'this' from several levels down

python - 为什么 PyCharm 无法找到正确版本的 pip 来安装 Python 模块?

python - 我的播放器移动不正确,按住键时,它应该连续移动,但只移动一次

python - 如何忽略颜色栏中的 NaN?

python - 将数据即时写入 CSV 并使用快速 api 下载文件

python - PyQt/Pyside - 动态创建和连接 - 捕获 lambda 中的函数和参数

c++ - 使用 ubuntu 终端在 c++ 上运行线程类的问题

android - 使用 RxJava Async 时的循环推理

java - 嵌套循环直角三角形java

c++ - 你能在 C++ 中保护嵌套类吗?