【问题标题】:Spark dataframe filter min(column) failedSpark 数据帧过滤器 min(column) 失败
【发布时间】:2021-04-08 16:35:42
【问题描述】:

我正在使用 hadoop 3.0.0 和 spark 2.2.0 中的以下 scala 代码处理数据帧。 BAQ 是 ID 列,AAA 是日期 YYMMDD 的字符串列。

scala> val dtfAbnoFirs=dtfAbno.filter("AAA>='20201201' and BAQ<>'0'").
     |   groupBy("BAQ").agg("AAA"->"min");
dtfAbnoFirs: org.apache.spark.sql.DataFrame = [BAQ: string, min(AAA): string]

scala> val dtfBase = dtfCons.select("BAQ","AAA").distinct().filter("BAQ<>'0'").
     |   join(dtfAbnoFirs,Seq("BAQ"),"inner");
dtfBase: org.apache.spark.sql.DataFrame = [BAQ: string, AAA: string ... 1 more field]

scala> val dtfBaseEsti=dtfBase.filter("AAA<min(AAA)");
dtfBaseEsti: org.apache.spark.sql.Dataset[org.apache.spark.sql.Row] = [BAQ: string, AAA: string ... 1 more field]

scala> dtfBaseEsti.show(10,false);
org.apache.spark.sql.catalyst.errors.package$TreeNodeException: execute, tree:
Exchange hashpartitioning(BAQ#12, 200)

它通过 filter("AAA

org.apache.spark.sql.catalyst.errors.package$TreeNodeException: execute, tree:
Exchange hashpartitioning(BAQ#12, 200)
+- *HashAggregate(keys=[BAQ#12, AAA#13], functions=[], output=[BAQ#12, AAA#13])
....
....
Caused by: java.lang.UnsupportedOperationException: Cannot evaluate expression: min(input[1, string, false])

这些是一些错误行。我用 AAA 作为 double 重新创建了数据帧,得到了同样的错误。

【问题讨论】:

  • 过滤 AAA
  • 加入后,在同一个数据框 dtfBaseEsti 中,AAA 有全年的日期,而 min(AAA) 只有 12 月的日期。另外,即使它什么也不返回,也不应该返回错误
  • 哦,我误读了这个问题。你能试试"AAA&lt;`min(AAA)`"吗? min 列名需要用反引号转义,否则将被解释为 AAA 列的最小值。

标签: scala dataframe apache-spark


【解决方案1】:
最后一条语句中的

min(AAA) 是列名,您必须用反引号 (`) 将其引用。 Spark 正在尝试以其他方式解析它

scala> val dtfBaseEsti=dtfBase.filter("AAA<`min(AAA)`");

【讨论】:

  • 是的,它有效,但这段代码之前有效。是因为我将 'min(AAE) ' 与单个值而不是另一列进行了比较? val dfBAQA001AL3 = dfDailAMinMax.filter("min(AAE)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-09
  • 1970-01-01
  • 2018-12-31
  • 2021-05-13
  • 2016-03-30
  • 1970-01-01
相关资源
最近更新 更多