Spark read()有效,但sql()抛出找不到数据库

时间:2017-01-11 04:22:05

标签: java apache-spark cassandra apache-spark-sql

我正在使用Spark 2.1从Java中的Cassandra读取数据。 我尝试了https://stackoverflow.com/a/39890996/1151472中发布的代码(使用SparkSession)并且它有效。但是,当我用spark.sql()替换spark.read()方法时,抛出以下异常:

Exception in thread "main" org.apache.spark.sql.AnalysisException: Table or view not found: `wiki`.`treated_article`; line 1 pos 14;
'Project [*]
+- 'UnresolvedRelation `wiki`.`treated_article`

    at org.apache.spark.sql.catalyst.analysis.package$AnalysisErrorAt.failAnalysis(package.scala:42)

我对read和sql方法使用相同的spark配置

read()代码: 数据集数据集=

spark.read().format("org.apache.spark.sql.cassandra")
                .options(new HashMap<String, String>() {
                    {
                        put("keyspace", "wiki");
                        put("table", "treated_article");
                    }
                }).load();

sql()代码:

spark.sql("SELECT * FROM WIKI.TREATED_ARTICLE");

2 个答案:

答案 0 :(得分:4)

Spark Sql使用Catalogue来查找数据库和表引用。当您写入不在目录中的表标识符时,它将抛出与您发布的错误类似的错误。 read命令不需要目录,因为您需要在调用中指定所有相关信息。

您可以通过

向目录添加条目

将数据集注册为视图

首先创建您的DataSet

spark.read().format("org.apache.spark.sql.cassandra")
                .options(new HashMap<String, String>() {
                    {
                        put("keyspace", "wiki");
                        put("table", "treated_article");
                    }
                }).load();

然后使用其中一个目录注册表函数

void    createGlobalTempView(String viewName)
Creates a global temporary view using the given name.
void    createOrReplaceTempView(String viewName)
Creates a local temporary view using the given name.
void    createTempView(String viewName)
Creates a local temporary view using the given name

或使用SQL创建语句

   CREATE TEMPORARY VIEW words
     USING org.apache.spark.sql.cassandra
     OPTIONS (
       table "words",
       keyspace "test",
       cluster "Test Cluster",
       pushdown "true"
     )

通过这些方法之一添加到目录中,您可以在该上下文发出的所有sql调用中引用该表。

实施例

CREATE TEMPORARY VIEW words
  USING org.apache.spark.sql.cassandra
  OPTIONS (
    table "words",
    keyspace "test"
  );

SELECT * FROM words;
// Hello    1
// World    2

Datastax(我的雇主)企业软件通过在Spark作为目录使用的Hive Metastore中放置条目来自动注册所有Cassandra表。这使得所有表都可以访问而无需手动注册。

此方法允许在没有伴随CREATE VIEW

的情况下使用select语句

答案 1 :(得分:0)

我想不出办法让这项工作脱颖而出。问题在于Spark并不知道要尝试的格式,并且键空间将指定这将指定的位置。我能找到的最接近这类文件的文档是Cassandra连接器文档的here in the DataFrames section。您可以尝试指定using语句,但我认为这不会在select中发挥作用。所以,除此之外你最好的选择是创建一个PR来处理这种情况,或坚持使用读取DSL。