【问题标题】:Unable to Create HIVE table in Apache Spark无法在 Apache Spark 中创建 HIVE 表
【发布时间】:2021-11-06 23:09:37
【问题描述】:

我正在尝试使用 Databricks 在 Apache Spark 中创建一个 HIVE 表。

我正在使用以下代码:

%sql
CREATE OR REPLACE VIEW testdatabase.testtable

AS

SELECT
*
FROM location '/mnt/mylocation'

但我收到以下错误:

Error in SQL statement: ParseException: 
extraneous input ''/mnt/mylocation'' expecting {<EOF>, ';'}(line 7, pos 14)

== SQL ==
CREATE OR REPLACE VIEW testdatabase.testtable

AS

SELECT
*
FROM location '/mnt/mylocation'

谁能告诉我哪里出错了?

【问题讨论】:

    标签: apache-spark azure-databricks


    【解决方案1】:

    您可以这样做,但您需要更改语法 - 而不是 location 使用格式(在 documentation 中有描述):

    <file_format>.`<location>`
    

    例如:

    %sql
    CREATE OR REPLACE VIEW testdatabase.testtable
    AS SELECT *
    FROM delta.`/mnt/mylocation`
    

    【讨论】:

    • 嗨,亚历克斯,感谢您的回答。在接受作为答案之前,我稍后会尝试这个 - 虽然我确信它会起作用
    • 是的,我已经在“完整版”上测试过了
    【解决方案2】:

    我不相信 VIEWS 支持在 SELECT 查询中指定数据源。

    CREATE VIEW Spark 3.0.1 Doc

    我相信只有 TABLES 支持location keyword。请记住,当您指定位置路径时,创建 Hive“表”只是指向文件的指针。

    将其更改为 CREATE TABLE 语句并指定架构应该可以工作。

    CREATE TABLE testdatabase.testtable (
     col1 INT,
     col2 STRING,
     ...
    )
    USING PARQUET
    LOCATION '/mnt/mylocation'
    

    如果您只是想要一些短暂的东西,您可以将其作为 DataFrame 读入,然后将其读入 register a temp table

    df = spark.read.parquet('/mnt/mylocation')
    df.createOrReplaceTempView('testtable')
    

    现在您可以在 SQL 单元格中使用 default.testtable

    【讨论】:

    • 它适用于 Databricks,只需要使用另一种语法。我相信它也应该在 Apache Spark 中工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多