IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Spark导出Hive表异常(Java):cannot resolve ‘`id`‘ given input columns -> 正文阅读

[大数据]Spark导出Hive表异常(Java):cannot resolve ‘`id`‘ given input columns

初次接触到大数据相关的信息,还有点不适应,通过不断搜索和尝试解决了Spark读取Hive表时出现的异常,错误如下:

Caused by:java.lang.RuntimeException:org.apache.spark.sql.AnalysisException: cannot resolve '`id`' given input columns:[demo.demo.id,demo.demo.name,demo.demo.birthday];
'Project ['id,'name,'age]
+- SubqueryAlias demo
 +-Relation[demo.id#0,demo.name#1,demo.birthday#2]JDBCRelation(demo)[numPartintions=1]
 ....

出现错误的代码如下:

	public static viod main(String[] args){
		String url = ""
		String username = "";
		String password = "";
		String driver = "";
		String path = "path";
		List<String> tables = Arrays.asList("demo");
		String sql = “select id,name,birthday from demo”;
		SparkSession spark = SparkSession.builder().appName("hiveDb").getOrCreate();
		Properties properties = new Properties();
		properties.setProperty("user",username);
		properties.setProperty("password",password);
		for (String table : tables){
			Dataset<Row> dataset = sparkSession.read().option("driver",driver).jdbc(url, table, properties);
			dataset.createOrReplaceTempView(table);
		}
		//调用sql(sql)时出错	
		sparkSession.sql(sql).write().option("header","true").mode("Append").csv(path);
	} 

观察错误,发现列是‘demo.demo.id’,感到懵逼,不知道怎么来的这个东西,所以用spark-shell进行测试,列名称是怎么来的:

scala>spark.read.jdbc(hiveUrl, "demo", connectionProperties).show()//这里的connectionProperties同上面代码的properties一样

执行以上代码返回结果:

+-------+---------+-------------+
|demo.id|demo.name|demo.birthday|
+-------+---------+-------------+
+-------+---------+-------------+

通过观察打印结果的表头发现,读取hive表的结果列是由表名称和列名称组合而成,而我们的临时视图也是跟表名称一样,所以才会导致以上错误中出现‘demo.demo.id’的列出现。

怎么解决这个问题呢,只需要对以上代码做调整:

public static viod main(String[] args){
		String url = ""
		String username = "";
		String password = "";
		String driver = "";
		String path = "path";
		List<String> tables = Arrays.asList("demo");
		String sql = “select id,name,birthday from demo”;
		SparkSession spark = SparkSession.builder().appName("hiveDb").getOrCreate();
		Properties properties = new Properties();
		properties.setProperty("user",username);
		properties.setProperty("password",password);
		for (String table : tables){
			Dataset<Row> dataset = sparkSession.read().option("driver",driver).jdbc(url, table, properties);
			//-----------------新增代码 开始------------------ 
			if(url.toLowerCase().startsWith("jdbc:hive2")){
				for(String column : dataset.columns)){
					String[] arr = column.split("\\.");
					dataset = dataset.withColumnRenamed(column, split[1]);
				}
			}
			//-----------------新增代码 结束------------------
			dataset.createOrReplaceTempView(table);
		}
		//调用sql(sql)时出错	
		sparkSession.sql(sql).write().option("header","true").mode("Append").csv(path);
	} 
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-08-13 12:07:06  更:2021-08-13 12:13:05 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 9:15:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码