所以在测试时,我收到此错误消息:
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进行测试时,它们会产生错误吗?
您好吗?
答案 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
。
要么:
尝试将列名更改为非保留字;或
将列名完全限定为joinedDF.from
。
NB您的第二个代码段引用了一个名为timeSpanDF
的数据帧,而您的第三个代码段引用了一个timeSpansDF
(复数)的数据帧。
编辑:作为社区的新成员,我没有足够的声誉来对@KZapagol的答案发表评论,但我相信他的答案的实质是原始海报的{ 1}}子句:joinedDF.where
=> col("category") === lit(category)
。