我们使用python spark cassandra驱动程序V3.0.0。来自datastax 当尝试使用dataframe加载数据时,where子句不起作用。 但是,CQL本身在Datastax DevCenter中可以正常工作。代码看起来像这样
dataf = sqlc.read.format("org.apache.spark.sql.cassandra")\
.options(table="tran_history", keyspace="test")\
.load()\
.where("usr_id='abc' log_ts >= maxtimeuuid('2016-02-01 10:09:26-0800')")\
.collect()
司机似乎无法识别方法maxtimeuuid
------------------以下是错误
File "C:\Spark\spark-1.4.1-bin-hadoop2.6.2\python\lib\pyspark.zip\pyspark\sql\dataframe.py", line 759, in filter
File "C:\Spark\spark-1.4.1-bin-hadoop2.6.2\python\lib\py4j-0.8.2.1-src.zip\py4j\java_gateway.py", line 538, in __call__
File "C:\Spark\spark-1.4.1-bin-hadoop2.6.2\python\lib\py4j-0.8.2.1-src.zip\py4j\protocol.py", line 300, in get_return_value
py4j.protocol.Py4JJavaError: An error occurred while calling o41.filter.
: java.util.NoSuchElementException: key not found: maxtimeuuid
不确定是否存在任何版本匹配问题。我们正在使用DSE 4.8.1。
答案 0 :(得分:1)
Dataframes不使用SparkCassandra连接器api,因此当您在DataFrame上键入where
时,它实际上正在调用Catalyst调用。这不会转移到底层的CQL层,而是应用于Spark本身。 Spark不知道“maxtimeuuid”是什么,所以它失败了。
使用给定的SQL表达式过滤行。
请参阅http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.sql.DataFrame
由于此谓词无效,因此它永远不会到达连接器,因此我们将无法在数据源级别处理这样的子句。
只有Spark Cassandra Connector RDD.where子句才会直接将CQL传递给基础RDD。
向查询添加CQL WHERE谓词。有用的杠杆作用 卡桑德拉的二级指数。隐式添加允许过滤 但是请注意WHERE子句中的某些谓词 被Cassandra拒绝,特别是在他们过滤的情况下 未编制索引的非聚类列。
将TimeUUID与Dataframes进行比较将很困难,因为Catalyst没有TimeUUID
作为一种类型的概念,因此Connector将它们(通过DataFrames)作为String读取它们。这是一个问题,因为TimeUUID在词汇上没有可比性,所以即使你生成TimeUUID然后直接与它比较而不是调用函数,你也无法得到正确的答案。