创建表my_table(年文本、月文本、日文本、小时整数、分钟整数、秒整数、主键(年、月、日)、小时、分钟、秒))
如果我使用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
很简单,CQL与Spark、Sql或Catalyst不兼容。您所看到的是语法上的冲突。
此where子句:
.where(year ='2017' and month ='01' and day ='16' and (hour,min,sec) >= (1,15,0)
不是直接推给卡桑德拉。相反,它被转换为catalyst谓词。这就是你有问题的地方
(hour,min,sec) >= (1,15,0)
struct<hour:int,min:int,sec:int>
struct<col1:int,col2:int,col3:int>
这些不是元组,而是显式类型化的结构。它们不能直接比较,因此您的错误。在DataFrame api中,您只需定义一个具有正确类型的新结构,并对其进行文字说明,但我不确定如何在SparkSQL中表达。
无论如何,这个元组谓词不会被下推到Cassandra。您定义的hour,min,sec结构将对Cassandra隐藏,因为基础表不提供结构
,这意味着Spark认为它需要在从Cassandra提取数据后生成该结构。
您最好使用@Akashethi提到的和
单独的子句
我有一个Spring启动应用程序,它使用来自 Kafka 集群中某个主题(例如 topic1)的消息。这就是我的代码目前的样子。 现在我想从另一个Kafka集群中的不同主题开始消费。一种方法是为此创建另一个bean。但是有更好的方法吗?
我们试图在给定的节点上启动多个独立的kafka hdfs连接器。 对于每个连接器,我们分别将和设置为不同的端口和路径。 也是Kafka经纪人JMX港是@ 9999。 当我启动 kafka 独立连接器时,出现错误 错误:代理引发异常:java.rmi.server。ExportException:端口已在使用:9999;嵌套异常是:java.net。BindException:地址已在使用中(绑定失
因此,我尝试使用Spark SQL进行以下查询('timestamp'是分区键): 虽然作业产生200个任务,但查询不会返回任何数据。 另外,我可以保证会返回数据,因为在cqlsh上运行查询(使用'token'函数进行适当的转换)确实会返回数据。 但不幸的是我不知道什么是“过滤器”...
可以对模型的查询和写入操作进行封装,例如: <?php namespace app\index\model; use think\Model; class User extends Model { public function scopeThinkphp($query) { $query->where('name','thinkphp')->field('i
我试图在本地mac中运行以下代码,其中运行有主从集群的spark集群 但是,在主控制台和
使用DynamoDB,没有简单的方法可以对列执行索引范围查询。主键、本地二级索引和全局二级索引都需要分区键来进行范围查询。 例如,假设我有一个带有数字分数属性的高分表。使用索引范围查询无法获得前10名或前25至50名 那么,执行这项极其常见的任务的惯用方式或首选方式是什么呢? > 接受表格扫描。 使用静态分区键并利用分区查询。 使用固定数量的静态分区键并使用多个分区查询。