我有一个特别的问题。在DSE Spark分析引擎中,我会生成频繁的统计信息,并将其存储在小表中的cassandra中。由于我将表修剪整齐,并且应该使用统一的信息为Web界面提供服务,因此我只想在spark中查询整个表并通过API发送结果。为此,我尝试了两种方法:
val a = Try(sc.cassandraTable [Data](键空间,表).collect())。toOption
val查询=“ SELECT * FROM keyspace.table”
val df = spark.sqlContext.sql(query) val list = df.collect()
我正在scala程序中执行此操作。当我使用方法1时,火花作业神秘地卡住,直到永远显示12的阶段10。在日志和Spark作业页面中验证。当我使用第二种方法时,它只是告诉我不存在这样的表:
未知异常:org.apache.spark.sql.AnalysisException:未找到表或视图:keyspace1
。table1
;第1行pos 15;
'项目[*]
+-'未解决的关系keyspace1
。table1
有趣的是,我在集群的spark shell中测试了这两种方法,它们都很好用。我的程序还有许多其他使用方法1进行的查询,它们都可以正常工作,关键的区别在于,在每个查询中,主分区键始终对此具有条件(与该查询相同)(对于该特定表也是如此)。
这是表结构:
CREATE TABLE keyspace1.table1 (
userid text,
stat_type text,
event_time bigint,
stat_value double,
PRIMARY KEY (userid, stat_type))
WITH CLUSTERING ORDER BY (stat_type ASC)
对于问题的可靠诊断或解决方法将不胜感激
答案 0 :(得分:0)
在cassandra中不带where子句的情况下执行select *
时,实际上是在执行全方位查询。这不是cassandra中的预期用例(除了查看数据之外)。只是为了好玩,尝试用select * from keyspace.table limit 10
代替,看看它是否可行,它可能...
无论如何,我的直觉表明您的问题不是火花,而是卡桑德拉。如果您对Cassandra指标具有可见性,请查找范围查询延迟。
现在,如果上面的代码完成了-方法1冻结,而方法2没有冻结的原因是,方法1包含一个动作(collect
),而方法2不涉及任何火花动作,只是模式推断。如果您将方法2 df.collect
添加到cassandra中,则会遇到相同的问题