簡體   English   中英

檢索任意行以獲得數據框中列的唯一組合

[英]Retrieve arbitrary row for unique combination of columns in a dataframe

我在數據框中有以下數據

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

我只需要col1,col2每個唯一組合的第一行,如下所示

Expected Output:

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

如何在pyspark(1.3.1版)中實現此目標?

我嘗試通過將數據幀轉換為rdd,然后應用map和reduceByKey函數,然后將結果rdd轉換回數據幀來實現相同的目的。 還有其他使用數據框功能執行上述操作的方法嗎?

如果您想要任意行,則可以嘗試使用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版本的不同,可以分別安排各個聚合。 這意味着

df.groupBy("col1", "col2").agg(first("col3"), first("col4"))

不保證col3col4將從同一行中選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM