我正在使用spark 1.3.1。在PySpark中,我从RDD创建了一个DataFrame并注册了模式,如下所示:
dataLen=sqlCtx.createDataFrame(myrdd, ["id", "size"])
dataLen.registerTempTable("tbl")
此时一切正常我可以从“tbl”进行“选择”查询,例如“从tbl选择大小,其中id ='abc'”。
然后在Python函数中,我定义了类似的东西:
def getsize(id):
total=sqlCtx.sql("select size from tbl where id='" + id + "'")
return total.take(1)[0].size
此时仍然没有问题,我可以执行getsize("ab")
并确实返回一个值。
当我在一个rdd中调用getsize
时发生了问题,比如我有一个rdd命名数据,它是(key,value)列表,当我这样做时
data.map(lambda x: (x[0], getsize("ab"))
这会产生错误
py4j.protocol.Py4JError:试图调用包
有什么想法吗?
答案 0 :(得分:0)
Spark不支持嵌套操作或转换,并且驱动程序外无法访问SQLContext
。所以你在这里做的事情根本行不通。目前还不清楚你想要的是什么,但很可能是一个简单的join
,无论是在RDDs
还是DataFrames
都可以做到这一点。