使用Spark Cassandra Connector在多个聚类列上运行范围查询时错误:



以下是Cassandra表格架:

创建表my_table( 年文字, 一个月的文字, 日文, 小时int, min int, sec int, 主钥匙(((年,月,日),小时,最小,SEC))

如果我使用cassandra cql进行查询,则有效:

SELECT * FROM my_table WHERE year ='2017' and month ='01' and day ='16' and (hour,min,sec) > (1,15,0) LIMIT 200

但是,当我使用Spark-Cassandra连接器运行相同的查询时,它不起作用:

sparkSession.read().format("org.apache.spark.sql.cassandra").options(map).load()
                .where(year ='2017' and month ='01' and day ='16' and (hour,min,sec) >= (1,15,0)");

我在日志中得到以下例外:

> Exception in thread "main" org.apache.spark.sql.AnalysisException:
> cannot resolve '(struct(`hour`, `min`, `sec`) >= struct(1, 15, 0))'
> due to data type mismatch: differing types in '(struct(`hour`, `min`,
> `sec`) >= struct(1, 15, 0))'  and (struct<hour:int,min:int,sec:int>
> struct<col1:int,col2:int,col3:int>).; line 1 pos 96

Spark-Cassandra-Connector版本:2.0.0-m3

Spark-version:2.0.0

任何帮助都非常感谢

完全简单地CQL不是SPARK SQL或CATALYST兼容。您看到的是语法中的冲突。

此处的子句:

.where(year ='2017' and month ='01' and day ='16' and (hour,min,sec) >= (1,15,0)

没有直接推到卡桑德拉。相反,它正在转化为催化剂谓词。这是您有问题的地方

cataylst看到这个

(hour,min,sec) >= (1,15,0)

并试图为它们制作类型

左手变为

struct<hour:int,min:int,sec:int>

右侧变为

struct<col1:int,col2:int,col3:int>

这些不是元组,而是明确键入的结构。它们无法直接比较,因此您的错误。在DataFrame API中,您只需定义一个具有正确类型的新结构并进行字面形式,但我不确定如何在SparkSQL中表达这一点。

不管这个元组谓词不会被推到卡桑德拉。您要定义的小时结构,最小,SEC将从Cassandra隐藏,因为底层表不提供Struct<hour, min, sec>,这意味着Spark认为需要在从Cassandra提取数据后产生它。

您最好只使用AND的单独子句@akashsethi

相关内容

  • 没有找到相关文章

最新更新