Spark [Scala]:不明确的groupBy按列名

时间:2019-03-11 07:03:36

标签: scala apache-spark

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

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进行测试时,它们会产生错误吗?

您好吗?

2 个答案:

答案 0 :(得分:0)

由于我没有代码来生成joinedDF,因此我自己准备了Dataframe来生成joindDF。我已经在ScalaTest中对其进行了测试,并且运行良好。

请如下更新您的代码。

npm run jest -- --coverage

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

npx jest --coverage

希望这会有所帮助!

答案 1 :(得分:-1)

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

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

要么:

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

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

NB您的第二个代码段引用了一个名为timeSpanDF的数据帧,而您的第三个代码段引用了一个timeSpansDF(复数)的数据帧。

编辑:作为社区的新成员,我没有足够的声誉来对@KZapagol的答案发表评论,但我相信他的答案的实质是原始海报的{ 1}}子句:joinedDF.where => col("category") === lit(category)