检索datafram中列的唯一组合的任意行

2024-09-29 01:35:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我在一个数据帧中有以下数据

col1    col2    col3    col4
1       desc1    v1      v3
2       desc2    v4      v2
1       desc1    v4      v2
2       desc2    v1      v3

我只需要第一行的每一个独特的组合col1,col2喜欢下面

^{pr2}$

如何在pyspark(1.3.1版)中实现这一点?在

我尝试并实现了同样的方法:将dataframe转换成rdd,然后应用map和reduceByKey函数,然后将结果rdd转换回dataframe。有没有其他方法可以使用dataframe函数执行上述操作?在


Tags: 数据方法函数dataframev3v2col2col3
1条回答
网友
1楼 · 发布于 2024-09-29 01:35:21

如果您想要一个任意行,可以尝试使用firstlast,但这远远不够漂亮,我会认真考虑升级Spark:

from pyspark.sql.functions import col, first

df = sc.parallelize([
  (1, "desc1", "v1", "v3"), (2, "desc2", "v4", "v2"),
  (1, "desc1", "v4", "v2"), (2, "desc2", "v1", "v3")
]).toDF(["col1", "col2", "col3", "col4"])

keys = ["col1", "col2"]
values = ["col3", "col4"]
agg_exprs = [first(c).alias(c) for c in keys + ["vs_"]]
select_exprs = keys + [
    "vs_.col{0} AS {1}".format(i + 1, v) for (i, v) in enumerate(values)]

df_not_so_first = (df
  .selectExpr("struct({}) AS vs_".format(",".join(values)), *keys)
  .groupBy(*keys)
  .agg(*agg_exprs)
  .selectExpr(*select_exprs))

请注意,在这个特定的上下文中,first没有选择任何特定的行,并且结果可能不是确定性的。此外,根据Spark版本,可以单独安排单独的聚合。意思是

^{pr2}$

不保证col3和{}将从同一行中选择。在

相关问题 更多 >