在 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:如何使用 Java 在 dataFrame 中的空值列中插入数据