当使用spark cassandra连接器时,Dataframe where子句不起作用

时间:2016-03-16 21:19:21

标签: cassandra where-clause

我们使用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。

1 个答案:

答案 0 :(得分:1)

Api冲突

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拒绝,特别是在他们过滤的情况下   未编制索引的非聚类列。

http://datastax.github.io/spark-cassandra-connector/ApiDocs/1.6.0-M1/spark-cassandra-connector/#com.datastax.spark.connector.rdd.CassandraRDD

Dataframes和TimeUUID

将TimeUUID与Dataframes进行比较将很困难,因为Catalyst没有TimeUUID作为一种类型的概念,因此Connector将它们(通过DataFrames)作为String读取它们。这是一个问题,因为TimeUUID在词汇上没有可比性,所以即使你生成TimeUUID然后直接与它比较而不是调用函数,你也无法得到正确的答案。