Spark read()工作,但sql()throws找不到数据库



我使用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)

我对读取和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");

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

您可以通过将条目添加到目录中

将数据集注册为视图

首先创建数据集

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

OR使用SQL Create语句

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(我的雇主)Enterprise软件通过将条目作为目录放置在Spark使用的Hive Metastore中,自动注册所有Cassandra表。这使得无需手动注册即可访问所有表。

此方法允许在没有附带CREATE VIEW的情况下使用select语句

我想不出一种方法可以让它从我的脑海中消失。问题在于Spark不知道要尝试的格式,而指定该格式的位置由密钥空间占据。我能在Cassandra连接器文档的DataFrames部分找到最接近此类内容的文档。您可以尝试指定using语句,但我认为这在select中不起作用。所以,除此之外,您最好的选择是创建一个PR来处理这种情况,或者坚持读取DSL。

相关内容

  • 没有找到相关文章

最新更新