火花卡桑德拉连接器使用目录问题

问题描述 投票:3回答:1

我正在按照指示 在此找到 来连接我的spark程序从Cassandra读取数据。下面是我配置spark的方法。

val configBuilder = SparkSession.builder
  .config("spark.sql.extensions", "com.datastax.spark.connector.CassandraSparkExtensions")
  .config("spark.cassandra.connection.host", cassandraUrl)
  .config("spark.cassandra.connection.port", 9042)
  .config("spark.sql.catalog.myCatalogName", "com.datastax.spark.connector.datasource.CassandraCatalog")

根据文档,一旦这样做,我就可以像这样查询Cassandra。

spark.sql("select * from myCatalogName.myKeyspace.myTable where myPartitionKey = something")

但是当我这样做的时候,我得到了以下错误信息:

mismatched input '.' expecting <EOF>(line 1, pos 43)

== SQL ==
select * from myCatalog.myKeyspace.myTable where myPartitionKey = something
----------------------------------^^^

当我以下面的格式尝试时,我成功地从Cassandra中检索条目。

val frame = spark
  .read
  .format("org.apache.spark.sql.cassandra")
  .options(Map("keyspace" -> "myKeyspace", "table" -> "myTable"))
  .load()
  .filter(col("timestamp") > startDate && col("timestamp") < endDate)

然而这个查询需要进行全表扫描。这个表包含了几百万个条目,我更想利用谓词Pushdown功能,似乎只有通过SQL API才能实现。

我使用的是spark-core_2.11:2.4.3, spark-cassandra-connector_2.11:2.5.0和Cassandra 3.11.6。

谢谢!我正在按照这里的说明进行操作。

apache-spark cassandra spark-cassandra-connector
1个回答
1
投票

Catalogs API仅在尚未发布的SCC 3.0版本中可用。它将随着Spark 3.0的发布而发布,所以它在SCC 2.5.0中不可用。 所以在2.5.0版本中,你需要显式注册你的表,使用 create or replace temporary view...作为 文档中所述:

spark.sql("""CREATE TEMPORARY VIEW myTable
     USING org.apache.spark.sql.cassandra
     OPTIONS (
     table "myTable",
     keyspace "myKeyspace",
     pushdown "true")""")

关于pushdowns (它们对所有Dataframe APIs、SQL、Scala、Python......都是一样的) - 当你的 timestamp 是第一个聚类列。 即使在这种情况下,典型的问题是你可能会指定 startDateendDate 为字符串,而不是时间戳。 你可以通过执行 frame.explain,并检查该谓词是否被推倒--它应该有 * 谓词名附近的标记。

例如:

val data = spark.read.cassandraFormat("sdtest", "test").load()
val filtered = data.filter("ts >= cast('2019-03-10T14:41:34.373+0000' as timestamp) AND ts <= cast('2019-03-10T19:01:56.316+0000' as timestamp)")
val not_filtered = data.filter("ts >= '2019-03-10T14:41:34.373+0000' AND ts <= '2019-03-10T19:01:56.316+0000'")

其一 filter 表达式会把谓词推倒,而第2个(not_filtered)需要进行全面扫描。

© www.soinside.com 2019 - 2024. All rights reserved.