如何在Spark中的map函数中使用数据帧?

时间:2016-03-08 05:01:34

标签: python apache-spark pyspark

解释

  • sampleDF是示例数据框,其中包含用于查找目的的列表记录。
  • sampleDS是一个RDD,其中包含元素列表。
  • mappingFunction是在sampleDS中查找sampleDF的元素,如果它们存在于sampleDF中则将其映射为1,如果它们不存在则将其映射到0

我有一个映射函数如下:

def mappingFunction(element):
    # The dataframe lookup!
    lookupResult = sampleDF.filter(sampleDF[0] == element).collect()
    if len(lookupResult) > 0:
        print lookupResult
        return 1
    return 0

问题:

在映射函数之外访问sampleDF的工作非常正常,但只要我在函数内部使用它,我就会收到以下错误:

py4j.Py4JException: Method __getnewargs__([]) does not exist
    at py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.java:335)
    at py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.java:344)
    at py4j.Gateway.invoke(Gateway.java:252)
    at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:133)
    at py4j.commands.CallCommand.execute(CallCommand.java:79)
    at py4j.GatewayConnection.run(GatewayConnection.java:209)
    at java.lang.Thread.run(Thread.java:744)

我还尝试了什么:

我确实尝试保存临时表并在地图功能中使用sqlContext选择,但仍无法使其正常工作。这是我得到的错误:

  File "/usr/lib64/python2.6/pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "/usr/lib64/python2.6/pickle.py", line 649, in save_dict
    self._batch_setitems(obj.iteritems())
  File "/usr/lib64/python2.6/pickle.py", line 686, in _batch_setitems
    save(v)
  File "/usr/lib64/python2.6/pickle.py", line 331, in save
    self.save_reduce(obj=obj, *rv)
  File "/opt/spark/python/pyspark/cloudpickle.py", line 542, in save_reduce
    save(state)
  File "/usr/lib64/python2.6/pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "/usr/lib64/python2.6/pickle.py", line 649, in save_dict
    self._batch_setitems(obj.iteritems())
  File "/usr/lib64/python2.6/pickle.py", line 681, in _batch_setitems
    save(v)
  File "/usr/lib64/python2.6/pickle.py", line 306, in save
    rv = reduce(self.proto)
TypeError: 'JavaPackage' object is not callable

我要求的是:

我试图通过简单的例子简化我的问题。任何有关如何使用数据框内部地图功能的帮助都非常感谢。

1 个答案:

答案 0 :(得分:3)

这是不可能的。 Spark不支持对分布式数据结构(RDDsDataFramesDatasets)的嵌套操作。即使它确实执行了大量工作也不是一个好主意。根据您显示的代码,您可能希望将RDD转换为DataFrame并执行join智慧

(rdd.map(x => (x, )).toDF(["element"])
  .join(sampleDF, sampleDF[0] == df[0])
  .groupBy("element")
  .agg(count("element") > 0))

另外,在map内打印是完全没用的,不要说它会增加额外的IO开销。