【问题标题】:Keeping only one record from spark dataframe. Not necessary distinct record从 spark 数据框中只保留一条记录。不需要明确的记录
【发布时间】:2019-04-18 19:58:47
【问题描述】:

我有以下数据:

id  type  price
1    us    1.99
1    ca    2.99
2    ca    1.99
3    au    2.99 
3    us    3.99
3    ca    2.99

基本上,我希望每个id 只获得一条记录,如果不止一条,那么我想保留一条带类型的记录,us 而不是其他记录。

期望的输出:

id  type  price
1    us    1.99
2    ca    1.99
3    us    3.99

如何使用PySparkSparkSQLSpark DataFrame 或表格执行此操作?

【问题讨论】:

  • 你为什么不试试这个? cols = ['id', 'type', 'price'] vals = [ (1, 'us', 1.99), (1, 'ca', 2.99), (2, 'ca', 1.99), (3, 'au', 2.99), (3, 'us', 2.99), (3, 'us', 3.99), (3 ,'ca', 2.99)] df = spark.createDataFrame(vals, cols) d = df.groupBy('id').agg(first('type').alias('type'), first('price').alias('price')).orderBy('id') d.show()
  • 谢谢,但它无法识别“第一”。甚至尝试过。 from pyspark.sql 导入函数为 F F.first。还是一样的。上面的查询如何首先产生“美国”?
  • 你能粘贴你目前尝试过的代码吗?
  • 这与您在上面给我的代码完全相同,我在 databrick note 中运行。我明天会发布它。但实际上是一样的。我想我可能不得不走这条路。从 df 获取所有“美国”并将其保存到 df1。从 df1 中获取不存在 id 的 df 的所有“CA”并将其保存到 df2。然后合并df1和df2。假设只有 'us' 和 'ca' 类型会起作用吗?

标签: apache-spark dataframe pyspark pyspark-sql databricks


【解决方案1】:

可以使用自定义排序的窗口函数,在Scala下面,猜猜,可以翻译成Python:

// data
val df = List(
  (1, "us", 1.99),
  (1, "ca", 2.99),
  (2, "ca", 1.99),
  (3, "au", 2.99),
  (3, "us", 3.99),
  (3, "ca", 2.99))
  .toDF("id", "type", "price")

// action
val sorting = when($"type" === "us", 0).otherwise(1)
val window = Window.partitionBy($"id").orderBy(sorting)
val result = df
  .withColumn("sortIndex", row_number().over(window))
  .where($"sortIndex" === 1)
  .drop("sortIndex")

结果:

+---+----+-----+
|id |type|price|
+---+----+-----+
|1  |us  |1.99 |
|2  |ca  |1.99 |
|3  |us  |3.99 |
+---+----+-----+

【讨论】:

    猜你喜欢
    • 2018-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-28
    相关资源
    最近更新 更多