我在PySpark中具有以下DataFrame df
。
import pyspark.sql.functions as func
df = spark\
.read \
.format("org.elasticsearch.spark.sql") \
.load("my_index/my_mapping") \
.groupBy(["id", "type"]) \
.agg(
func.count(func.lit(1)).alias("number_occurrences"),
func.countDistinct("host_id").alias("number_hosts")
)
ds = df.collect()
我使用collect
是因为分组和聚合之后的数据量总是很小并且适合内存。
另外,我需要使用collect
,因为我将ds
传递为udf
函数的参数。
函数collect
返回一个数组。我如何对该数组进行以下查询:对于给定的id
和type
,返回number_occurrences
和number_hosts
。
例如,假设df
包含以下行:
id type number_occurrences number_hosts
1 xxx 11 3
2 yyy 10 4
完成df.collect()
之后,如何检索等于{{1}的number_occurences
和等于{{1的number_hosts
的{{1}}和id
}}。
预期结果是:
1
更新:
也许有更优雅的解决方案?
type
答案 0 :(得分:0)
如果您的id
是唯一的,那么id就是这种情况,您可以根据id对数组进行排序。这只是确保顺序正确,如果您的ID是连续的,则可以直接访问记录并将ID减去1
test_df = spark.createDataFrame([
(1,"xxx",11,3),(2,"yyyy",10,4),
], ("id","type","number_occurrences","number_hosts"))
id = 1
type = "xxx"
sorted_list = sorted(test_df.collect(), cmp=lambda x,y: cmp(x["id"],y["id"]))
sorted_list[id-1]["number_occurrences"],sorted_list[id-1]["number_hosts"]
结果:
(11, 3)