【问题标题】:How to create an EXTERNAL Spark table from data in HDFS如何从 HDFS 中的数据创建 EXTERNAL Spark 表
【发布时间】:2020-12-01 03:01:30
【问题描述】:

我已从 HDFS 将 parquet 表加载到 DataFrame 中:

val df = spark.read.parquet("hdfs://user/zeppelin/my_table")

我现在想将此表公开给 Spark SQL,但这必须是一个持久表,因为我想从 JDBC 连接或其他 Spark 会话访问它。

快速的方法可能是调用df.write.saveAsTable 方法,但在这种情况下,它将具体化DataFrame 的内容并创建指向Hive 元存储中数据的指针,从而在HDFS 中创建数据的另一个副本。

我不想拥有相同数据的两个副本,所以我想创建一个外部表来指向现有数据。

【问题讨论】:

    标签: apache-spark hive


    【解决方案1】:

    要创建 Spark 外部表,您必须指定 DataFrameWriter 的“路径”选项。像这样的:

    df.write.
      option("path","hdfs://user/zeppelin/my_mytable").
      saveAsTable("my_table")
    

    但问题是,它会清空您的 hdfs 路径 hdfs://user/zeppelin/my_mytable,从而消除您现有的文件,并导致 org.apache.spark.SparkException: Job aborted.。这看起来像是 Spark API 中的一个错误...

    无论如何,解决方法(在 Spark 2.3 中测试)是创建一个外部表,但来自 Spark DDL。如果您的表有很多列,则创建 DDL 可能会很麻烦。幸运的是,从 Spark 2.0 开始,您可以调用 DDL SHOW CREATE TABLE 让 spark 完成工作。问题是您实际上可以在持久表中运行SHOW CREATE TABLE

    如果表很大,我建议获取表的样本,将其保存到另一个位置,然后获取 DDL。像这样的:

    // Create a sample of the table 
    val df = spark.read.parquet("hdfs://user/zeppelin/my_table")
    df.limit(1).write.
        option("path", "/user/zeppelin/my_table_tmp").
        saveAsTable("my_table_tmp")
    
    // Now get the DDL, do not truncate output
    spark.sql("SHOW CREATE TABLE my_table_tmp").show(1, false)
    

    你会得到一个像这样的 DDL:

    CREATE TABLE `my_table_tmp` (`ID` INT, `Descr` STRING)
    USING parquet
    OPTIONS (
      `serialization.format` '1',
      path 'hdfs:///user/zeppelin/my_table_tmp')
    

    您希望将其更改以具有表的原始名称原始数据的路径。您现在可以运行以下命令来创建指向现有 HDFS 数据的 Spark 外部表:

    spark.sql("""
      CREATE TABLE `my_table` (`ID` INT, `Descr` STRING)
      USING parquet
      OPTIONS (
        `serialization.format` '1',
        path 'hdfs:///user/zeppelin/my_table')""")
    

    【讨论】:

    • 当我尝试specify "path" optionOverwrite 模式)时,我没有得到任何SparkException。但是生成的HiveEXTERNAL 表的架构不正确:它将所有列折叠到col array<string>
    • @y2k-shubham 您使用的是 parquet 格式还是 csv?如果您使用的是 CSV,则字段分隔符可能有问题
    • @Gabriel Avellaneda 我以ORC 格式输出它。看起来像wasn't just me。顺便说一句,直接的解决方案是运行 Hive DROP TABLE.. 命令,然后使用适当的架构运行 CREATE EXTERNAL TABLE..
    猜你喜欢
    • 1970-01-01
    • 2017-09-12
    • 1970-01-01
    • 1970-01-01
    • 2016-09-27
    • 2015-11-26
    • 1970-01-01
    • 2022-11-03
    • 2017-09-24
    相关资源
    最近更新 更多