数据框上的map
函数有问题。我有一个火花sql数据帧,名为df
,假设它是这样的:
+----------+------------+------+
| time| tag| value|
+----------+------------+------+
|1399766400|A00000000001|1000.0|
|1399766401|A00000000002|1001.0|
+----------+------------+------+
我可以使用以下命令根据标签值选择其中的一部分:
temp = sqlContext.sql("SELECT * FROM df WHERE tag = 'A00000000001'")
temp.show(1)
然后我们有:
+----------+------------+------+
| time| tag| value|
+----------+------------+------+
|1399766400|A00000000001|1000.0|
+----------+------------+------+
目前,我有一个列表
x = ["SELECT * FROM df WHERE tag = 'A00000000001'", "SELECT * FROM df WHERE tag = 'A00000000002'"]
它已存储为 RDD 变量,我想在其上应用map
函数来计算根据它们选择的数据帧数量,我尝试了以下函数:
y = x.map(lambda x: sqlContext.sql(x).count())
y.take(2)
我认为返回值应该是[1, 1]
的,但它给出了错误:
TypeError: 'JavaPackage' object is not callable
是否可以使用此方法在数据帧上执行映射函数? 如果没有,我该怎么办。
如前所述,不可能对分布式数据结构执行嵌套操作。在更一般的意义上,Spark不是一个数据库。Spark 数据结构(包括DataFrames
)不是为单记录检索等任务而设计的。
如果所有查询都遵循相同的模式,即按列使用简单筛选器,则只需简单聚合 with 和 join:
tags = sc.parallelize([("A00000000001", ), ("A00000000002", )]).toDF(["tag"])
tags.join(df, ["tag"]).groupBy("tag").count()
<</div>
div class="one_answers"> 这是不可能的。您可以使用列表推导式:
>>> xs = ["SELECT * FROM df WHERE tag = 'A00000000001'", "SELECT * FROM df WHERE tag = 'A00000000002'"]
>>> [sqlContext.sql(x).count() for x in xs]