在 Apache Spark 中,用 Java 将数据帧写入 Hive 表

Posted

技术标签:

【中文标题】在 Apache Spark 中,用 Java 将数据帧写入 Hive 表【英文标题】:In Apache Spark Writing a Dataframe to Hive table in Java 【发布时间】:2017-07-24 18:53:42 【问题描述】:

我正在尝试完成“将数据帧写入 Hive 表”的简单事情,下面是用 Java 编写的代码。我正在使用 Cloudera VM,没有任何变化。

 public static void main(String[] args) 
    String master = "local[*]";

    SparkSession sparkSession = SparkSession
            .builder().appName(JsonToHive.class.getName())
            //.config("spark.sql.warehouse.dir", "hdfs://localhost:50070/user/hive/warehouse/")
            .enableHiveSupport().master(master).getOrCreate();

    SparkContext context = sparkSession.sparkContext();
    context.setLogLevel("ERROR");

    SQLContext sqlCtx = sparkSession.sqlContext();
    Dataset<Row> rowDataset = sqlCtx.jsonFile("employees.json");
    rowDataset.printSchema();
    rowDataset.registerTempTable("employeesData");

    Dataset<Row> firstRow = sqlCtx.sql("select employee.firstName, employee.addresses from employeesData");
    firstRow.show();

    sparkSession.catalog().listTables().select("*").show();

    firstRow.write().mode() saveAsTable("default.employee");
    sparkSession.close();


我已经使用 HQL 在 HIVE 中创建了托管表,

 CREATE TABLE employee ( firstName STRING, lastName STRING, addresses  ARRAY < STRUCT < street:STRING,  city:STRING, state:STRING > > )  STORED AS PARQUET;

我正在为“employees.json”中的数据读取一个简单的 JSON 文件

"employee":"firstName":"Neil","lastName":"Irani","addresses":["street":"36th","city":"NYC","state":"Ny","street":"37th","city":"NYC","state":"Ny","street":"38th","city":"NYC","state":"Ny"]

它说“表default.employee已经存在。;”并且它不附加内容。如何将内容附加到 hive 表??

如果我设置模式(“追加”),它不会抱怨但它也不会写内容..

firstRow.write().mode("append") saveAsTable("default.employee");

任何帮助将不胜感激...谢谢。

+-------------+--------+-----------+---------+-----------+
|         name|database|description|tableType|isTemporary|
+-------------+--------+-----------+---------+-----------+
|     employee| default|       null|  MANAGED|      false|
|employeesdata|    null|       null|TEMPORARY|       true|
+-------------+--------+-----------+---------+-----------+

更新

/usr/lib/hive/conf/hive-site.xml 不在类路径中,因此它没有读取表,在将其添加到类路径中后它工作正常......因为我是从 IntelliJ 运行的,所以我有这个问题..在生产中 spark-conf 文件夹将链接到 hive-site.xml ...

【问题讨论】:

你需要创建HiveContext HiveContext sqlContext = new org.apache.spark.sql.hive.HiveContext(ctx.sc()); 我认为根本问题是我无法连接到 LOCAL-hive,下面的调用返回“线程“主”org.apache.spark.sql.catalyst.analysis.NoSuchTableException 中的异常:在数据库“默认”中找不到表或视图“员工”;” hiveContext.sql("显示来自 default.employee 的列").show(); sqlCtx.sql("SHOW COLUMNS FROM default.employee").show(); 在 HiveContext 上设置配置 .. 也没有运气...... hiveContext.setConf("hive.metastore.warehouse.dir", "hdfs://localhost: 50070/用户/蜂巢/仓库”); hiveContext.sql("SHOW COLUMNS FROM employee").show(); 【参考方案1】:

看起来你应该使用insertInto(String tableName) 而不是saveAsTable(String tableName)

firstRow.write().mode("append").insertInto("default.employee");

【讨论】:

我认为根本问题是我无法连接到 LOCAL-hive,下面的调用返回“线程“主”org.apache.spark.sql.catalyst.analysis.NoSuchTableException 中的异常:在数据库“默认”中找不到表或视图“员工”;” hiveContext.sql("SHOW COLUMNS FROM default.employee").show(); sqlCtx.sql("SHOW COLUMNS FROM default.employee").show(); 在 HiveContext 上设置配置 .. 也没有运气...... hiveContext.setConf("hive.metastore.warehouse.dir", "hdfs://localhost: 50070/用户/蜂巢/仓库”); hiveContext.sql("SHOW COLUMNS FROM employee").show(); 你试过insertInto("employee")吗? 是的,我没有运气.. 实际问题是 metastore_db 是在我的本地驱动器中创建的.. 这表示我的 spark-job 根本没有连接到 Hive 数据库...

以上是关于在 Apache Spark 中,用 Java 将数据帧写入 Hive 表的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Java API 将文本文件、图像存储到 Apache Spark 中?

使用 Apache Spark 和 Java 将 CSV 解析为 DataFrame/DataSet

在 Apache Spark 中跨执行程序共享数据

Apache Spark:如何使用 Java 在 dataFrame 中的空值列中插入数据

将 CSV 数据加载到 Dataframe 并使用 Apache Spark (Java) 转换为 Array

使用java将oracle数据库连接到apache spark时出错