apache-spark - 如何从 HDFS 中的数据创建 EXTERNAL Spark 表

标签 apache-spark hive

我已将 HDFS 中的 parquet 表加载到 DataFrame 中:
val df = spark.read.parquet("hdfs://user/zeppelin/my_table")
我现在想将此表公开给 Spark SQL,但这必须是一个持久表,因为我想从 JDBC 连接或其他 Spark session 访问它。

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

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

最佳答案

要创建 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')""")

关于apache-spark - 如何从 HDFS 中的数据创建 EXTERNAL Spark 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50050016/

相关文章:

scala - 如何将Spark DataFrame插入Hive内表?

apache-spark - 如何通过嵌套数组字段(数组中的数组)过滤Spark sql?

python - 在从其他列(Spark)派生的数据框中添加新列

hadoop - 确认重写查询

python - 有没有办法使用python脚本将特定的平面文件(.txt或.csv)提取到HDFS中

hadoop - HIVE-ALTER TABLE my_table聚集者(my_field)放入32个桶-追溯适用吗?

sql - 删除 treasure-data/hadoop 中的查询?

hadoop - 从HDFS导入表到Spark

python - 带逗号的 PySpark 值不包含逗号? (尝试转换为 ArrayType(StringType()))

python - 无法推断类型 : <type 'str' > 的架构