【问题标题】:Dataframe where clause doesn't work when use spark cassandra connector使用 spark cassandra 连接器时,数据框 where 子句不起作用
【发布时间】:2016-03-17 06:14:32
【问题描述】:

我们使用 python spark cassandra 驱动程序 V3.0.0。来自数据税 当尝试使用数据框加载数据时,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。

【问题讨论】:

    标签: cassandra where-clause


    【解决方案1】:

    API 冲突

    Dataframe 不使用 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 谓词。有利于利用 Cassandra 中的二级索引。隐式添加一个 ALLOW FILTERING WHERE 子句的子句,但要注意某些谓词可能 被 Cassandra 拒绝,特别是在他们过滤 未索引的非聚集列。

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

    数据帧和 TimeUUID

    比较 TimeUUID 和 Dataframe 会很困难,因为 Catalyst 没有 TimeUUID 作为类型的概念,因此连接器(通过 DataFrame)将它们作为字符串读取。这是一个问题,因为 TimeUUID 在词法上不具有可比性,因此即使生成 TimeUUID 然后直接与它进行比较而不是调用函数,您也不会得到正确的答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 2015-09-11
      • 2019-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多