【问题标题】:Spark[Scala]: Ambiguous groupBy column nameSpark [Scala]:不明确的 groupBy 列名
【发布时间】:2019-03-11 17:58:17
【问题描述】:

所以在测试时我收到以下错误消息:

org.apache.spark.sql.AnalysisException: Reference 'from' is ambiguous, could be: from, from.;

在测试时但不是在我运行spark-shell...中的部分时?

我正在对以下数据框进行交叉连接:

scala> timeSpanDF.show
+----------+----------+
|      from|        to|
+----------+----------+
|2018-01-01|2018-02-01|
|2018-01-01|2018-03-01|
|2018-02-01|2018-03-01|
+----------+----------+


scala> df.show
+------------+----------+--------+-----+--------------------+
|pressroom_id|     month|category|event|               email|
+------------+----------+--------+-----+--------------------+
|           1|2017-01-01| contact| open|somebody@example.com|
|           1|2018-01-01| contact| open|     me1@example.com|
|           1|2018-02-01| contact| open|     me1@example.com|
|           1|2018-02-01| contact| open|     me1@example.com|
|           1|2018-01-01| contact| open|     you@example.com|
|           1|2018-03-01| contact| open|     etc@example.com|
|           1|2018-02-01| contact| open|     me2@example.com|
|           1|2018-02-01| contact| open|     me2@example.com|
|           2|2018-01-01| contact| open|     me1@example.com|
+------------+----------+--------+-----+--------------------+

所以我这样做

val joinedDF = timeSpansDF
    .crossJoin(df)
    .filter(
        df("month") >= timeSpansDF("from") 
        && df("month") < timeSpansDF("to")
    )
    .distinct

得到这个

scala> joinedDF.show
+----------+----------+------------+----------+--------+-----+---------------+
|      from|        to|pressroom_id|     month|category|event|          email|
+----------+----------+------------+----------+--------+-----+---------------+
|2018-01-01|2018-03-01|           2|2018-01-01| contact| open|me1@example.com|
|2018-02-01|2018-03-01|           1|2018-02-01| contact| open|me1@example.com|
|2018-02-01|2018-03-01|           1|2018-02-01| contact| open|me2@example.com|
|2018-01-01|2018-03-01|           1|2018-01-01| contact| open|me1@example.com|
|2018-01-01|2018-02-01|           1|2018-01-01| contact| open|me1@example.com|
|2018-01-01|2018-03-01|           1|2018-02-01| contact| open|me2@example.com|
|2018-01-01|2018-02-01|           2|2018-01-01| contact| open|me1@example.com|
|2018-01-01|2018-03-01|           1|2018-01-01| contact| open|you@example.com|
|2018-01-01|2018-03-01|           1|2018-02-01| contact| open|me1@example.com|
|2018-01-01|2018-02-01|           1|2018-01-01| contact| open|you@example.com|
+----------+----------+------------+----------+--------+-----+---------------+

然后我想像这样聚合这个表,这就是我得到奇怪消息的地方:

joinedDF.where(col("category") === lit(category) && col("event") === lit("open"))
    .groupBy("pressroom_id", "from", "to")
    .agg(count("email").cast("integer").as("something"))

指向 groupBy。奇怪的是,这在 shell 中有效,但是当这些操作被放入函数并使用 scalaTest 测试时,它们会出现错误?

医生怎么样?

【问题讨论】:

  • 你能分享你的ScalaTest代码吗?想知道您是如何通过 ScalaTest 进行测试的。

标签: scala apache-spark


【解决方案1】:

由于我没有生成joinedDF的代码,因此我自己准备了Dataframe来生成joinedDF。我已经在ScalaTest中对其进行了测试,它工作正常。

请更新您的代码如下。

val df = Seq(("2018-01-01", "2018-03-01", 2,"contact","open","me1@example.com"),
                ("2018-02-01","2018-03-01",1, "contact","open","me1@example.com"),
                ("2018-01-01","2018-03-01",1, "contact","open","you@example.com"),
                ("2018-02-01","2018-03-01",1, "contact","open","me1@example.com"),
                ("2018-01-01","2018-02-01",1, "contact","open","me1@example.com"),
                ("2018-01-01","2018-02-01", 1, "contact","open","you@example.com")).
      toDF("from", "to", "pressroom_id","category","event","email")

df.show() 

+----------+----------+------------+--------+-----+---------------+
|      from|        to|pressroom_id|category|event|          email|
+----------+----------+------------+--------+-----+---------------+
|2018-01-01|2018-03-01|           2| contact| open|me1@example.com|
|2018-02-01|2018-03-01|           1| contact| open|me1@example.com|
|2018-01-01|2018-03-01|           1| contact| open|you@example.com|
|2018-02-01|2018-03-01|           1| contact| open|me1@example.com|
|2018-01-01|2018-02-01|           1| contact| open|me1@example.com|
|2018-01-01|2018-02-01|           1| contact| open|you@example.com|
+----------+----------+------------+--------+-----+---------------+

val df1 = df.where(col("category") === lit("contact") && col("event") === lit("open"))
      .groupBy("pressroom_id", "from", "to")
      .agg(count("email").cast("integer").as("something"))

df1.show()



   +------------+----------+----------+---------+
|pressroom_id|      from|        to|something|
+------------+----------+----------+---------+
|           2|2018-01-01|2018-03-01|        1|
|           1|2018-01-01|2018-03-01|        1|
|           1|2018-02-01|2018-03-01|        2|
|           1|2018-01-01|2018-02-01|        2|
+------------+----------+----------+---------+

我在我的代码中添加了 import 语句。

import org.apache.spark.sql.functions._

希望对您有所帮助!

【讨论】:

  • 这看起来和之前的一模一样...?
  • 是的。您的代码中有一些错字。我已经使用 ScalaTest 测试了上面的代码,它工作正常。但我想知道你是如何得到错误的。我的代码是否仍然出现同样的错误?
【解决方案2】:

我不是 Scala 专家,但我是一名数据库管理员。

我怀疑您的问题源于使用 SQL 保留字 from 作为列名,因为堆栈跟踪显示异常来自 Spark SQL 模块:org.apache.spark.sql.AnalysisException

要么:

  1. 尝试将列名更改为非保留字;或

  2. 将列名完全限定为joinedDF.from

NB 您的第二个代码 sn-p 指的是一个名为 timeSpanDF 的数据帧,而您的第三个代码指的是 timeSpansDF(复数)。

编辑:作为社区的新成员,我没有足够的声誉对@KZapagol 的答案发表评论,但我相信他的回答的本质是原始发布者的@987654327 中有错字@ 子句:col("category") === lit(category) => col("category") === lit("contact")

【讨论】:

  • 好像有错字。我只是想知道他是如何得到org.apache.spark.sql.AnalysisException: Reference 'from' is ambiguous, could be: from, from. 错误的,因为我已经用 ScalaTest 进行了测试并且它工作正常。
  • 有人在未发表评论的情况下否决了我的回答。我的解释确实为例外提供了理由。我想我们正在等待原始海报的反馈。
  • 有一个相关的问题:stackoverflow.com/questions/41905709/…,但在那种情况下,异常确实是由于拼写错误导致查询中列名重复的结果。这在这里似乎是不可能的。
  • 是的,这不是列名问题,因为我指定了col("from"),它不会留下任何歧义的空间(或者我认为)。该错误似乎是 Spark 错误,我的意思是 'from' is ambiguous, could be: from, from.; 中的句点 from. 是否重要?
  • 在提供这个答案时,我将您的查询抽象了一层,以考虑 Spark 组合的实际查询语句可能是什么(我不确定 Spark 如何在内部处理这个问题)。 “基本”SQL 查询类似于select columname from tablename。如果您的列名是“来自”,那么这可能会导致形成像select from from tablename 这样的 SQL 查询。您是否尝试过临时更改列名?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 1970-01-01
  • 2018-09-09
  • 2019-05-15
  • 1970-01-01
  • 1970-01-01
  • 2019-11-06
相关资源
最近更新 更多