【问题标题】:How to find max value Alphabet from DataFrame apache spark?如何从 DataFrame apache spark 中找到最大值 Alphabet?
【发布时间】:2017-06-02 15:52:37
【问题描述】:

我正在尝试从整个熊猫数据框中获取最大值 Alphabet。我对它来自哪一行或哪一列不感兴趣。我只对数据框中的单个最大值感兴趣。

这就是它的样子:

id conditionName
1     C
2     b
3     A
4     A
5     A

预期结果是:

|id|conditionName|
+--+-------------+
| 3|   A         |
| 4|   A         |
| 5|   A         |
+----------------+

因为'A'是字母表的第一个字母

df= df.withColumn("conditionName", col("conditionName").cast("String"))
    .groupBy("id,conditionName").max("conditionName");
df.show(false);

例外:“conditionName”不是数字列。聚合函数只能应用于数值列。;

我需要整个数据帧字母字符的最大值。 我应该使用什么,才能达到预期的效果?

提前感谢!

【问题讨论】:

  • 预期输出是什么?你对"max value from Alphabet"的定义是什么
  • 对不起,我会编辑一下,谢谢提醒!
  • 仍然不清楚为什么,是因为"A"是字母表的第一个字母还是因为它的计数最高?
  • 因为“A”是字母表的第一个字母 :)

标签: apache-spark pyspark spark-dataframe bigdata


【解决方案1】:

您可以按字符串列对DataFrame 进行排序,获取第一个值并使用它来过滤原始数据:

from pyspark.sql.functions import lower, desc, first

# we need lower() because ordering strings is case sensitive
first_letter = df.orderBy((lower(df["condition"]))) \
                 .groupBy() \
                 .agg(first("condition").alias("condition")) \
                 .collect()[0][0]

df.filter(df["condition"] == first_letter).show()
#+---+---------+
#| id|condition|
#+---+---------+
#|  3|        A|
#|  4|        A|
#|  5|        A|
#+---+---------+

或者更优雅地使用Spark SQL

df.registerTempTable("table")
sqlContext.sql("SELECT * 
                FROM table 
                WHERE lower(condition) = (SELECT min(lower(condition)) 
                                          FROM table)
               ")

【讨论】:

  • 如果 Spark SQL min() 有效,为什么不 pyspark.sql.functions.min?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-11
  • 1970-01-01
  • 2016-12-09
  • 2011-12-07
  • 2015-06-19
  • 2015-10-12
相关资源
最近更新 更多