java通过jdbc连接hive数据库时,无法使用count()语句

5 篇文章 0 订阅

问题:

java通过jdbc连接hive数据库

可以运行

select * from tables

但是运行count(*) 报错:

select count(*) from tables

解决

参考1:zyl26的博客

出现原因可能是:

因为执行" select * from table; "并不需要启动mapreduce任务。而执行"select count(*) from table;"需要启动mapreduce任务。解决方法看执行过程的错误信息,我得到的信息是当前用户对于hdfs文件系统的/user文件夹没有写权限,只要开放权限,就可以解决问题。

但是具体怎么放开权限,博客中没有给出(尴尬)

没办法,去看hive日志寻找线索:
每个人的hive日志路径都不同,具体可以查看

vi $HIVE_HOME/conf/hive-log4j.properties

一般hive.log.dir 都是 /tmp/***
在这里插入图片描述

进入 hive.log.dir下的,打开 hive.log.对应日期,我打开的是 hive.log.2020-11-24

tail -200f hive.log.2020-11-24

查看报错为:

Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.AccessControlException): Permission denied: user=anonymous, access=EXECUTE, inode="/stage/anonymous/.staging/job_1606096562668_0026":root:supergroup:drwx------

Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.AccessControlException): Permission denied: user=anonymous, access=EXECUTE, inode="/stage/anonymous/.staging/job_1606096562668_0028":root:supergroup:drwx------

参考2:azhao_dn 的博客

原因的确是hdfs上文件夹的权限问题,故:

赋值权限:

hadoop fs -chmod -R 777 /tmp

hadoop fs -chmod -R 777 /stage

查看权限:
hdfs dfs -ls /

变为:
drwxrwxrwx - root supergroup 0 2020-10-23 14:27 /tmp

drwxrwxrwx - root supergroup 0 2020-10-23 14:27 /stage

再次运行,java连接hdfs,成功,完活!!!

### 回答1: 要通过Java代码实现SparkSQL操作数据库,需要遵循以下步骤: 1. 导入相关的依赖库,包括Spark SQL和JDBC驱动程序。 2. 创建SparkSession对象,设置相关的配置信息,如应用程序名称、Master URL等。 3. 使用SparkSession对象创建DataFrame或Dataset对象,通过读取数据库中的表或查询结果来加载数据。 4. 对DataFrame或Dataset对象进行数据处理和转换,如过滤、聚合、排序等操作。 5. 将处理后的数据保存到数据库中,或者通过JDBC连接执行SQL语句数据库进行操作。 下面是一个简单的示例代码,演示了如何使用Java代码实现SparkSQL操作数据库: ```java import org.apache.spark.sql.Dataset; import org.apache.spark.sql.Row; import org.apache.spark.sql.SparkSession; public class SparkSQLDemo { public static void main(String[] args) { // 创建SparkSession对象 SparkSession spark = SparkSession.builder() .appName("SparkSQLDemo") .master("local[*]") .config("spark.sql.warehouse.dir", "/user/hive/warehouse") .getOrCreate(); // 读取数据库中的表 Dataset<Row> df = spark.read() .format("jdbc") .option("url", "jdbc:mysql://localhost:3306/test") .option("dbtable", "student") .option("user", "root") .option("password", "123456") .load(); // 对数据进行处理和转换 Dataset<Row> result = df.filter("age > 18") .groupBy("gender") .count() .orderBy("gender"); // 将结果保存到数据库中 result.write() .format("jdbc") .option("url", "jdbc:mysql://localhost:3306/test") .option("dbtable", "result") .option("user", "root") .option("password", "123456") .save(); // 关闭SparkSession对象 spark.stop(); } } ``` 在上面的示例代码中,我们使用SparkSession对象读取了数据库中的student表,然后对数据进行了过滤、聚合和排序等操作,最后将结果保存到了result表中。需要注意的是,我们在读取和保存数据使用JDBC连接,并设置了相关的参数,如数据库URL、用户名和密码等。 ### 回答2: 使用Java代码操作SparkSQL和数据库需要按照以下步骤进行: 1. 引入Spark SQL和JDBC的相关依赖 在使用SparkSQL和JDBC之前,需要在Java项目中引入相关依赖。可以通过Maven或Gradle等构建工具引入这些依赖。比如,以下是使用Maven引入的相关依赖: ```xml <dependencies> <!--Spark SQL依赖--> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_2.11</artifactId> <version>2.4.5</version> </dependency> <!--JDBC依赖--> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>42.2.5</version> </dependency> </dependencies> ``` 2. 创建SparkSession对象 在Java代码中使用SparkSQL,需要先创建SparkSession对象,该对象是SparkSQL的一个入口点。可以通过如下代码创建SparkSession对象: ```java SparkSession spark = SparkSession .builder() .appName("Java Spark SQL Example") .config("spark.master", "local") .getOrCreate(); ``` 3. 连接数据库 连接数据库需要使用JDBC驱动程序来完成。可以通过如下代码连接PostgreSQL数据库: ```java //定义JDBC链接URL和用户名密码 String dbUrl = "jdbc:postgresql://localhost:5432/testdb"; String username = "postgres"; String password = "postgres"; //创建连接 Properties connectionProperties = new Properties(); connectionProperties.setProperty("user", username); connectionProperties.setProperty("password", password); connectionProperties.setProperty("driver", "org.postgresql.Driver"); //读取数据库表数据 Dataset<Row> jdbcDF = spark.read() .jdbc(dbUrl, "person", connectionProperties); jdbcDF.show(); ``` 4. 执行SparkSQL操作 连接数据库后,就可以执行SparkSQL操作了。可以使用DSL语言或SQL语句来操作数据。比如,以下是使用DSL语言操作数据的代码: ```java //过滤25岁以上的人员 Dataset<Row> filteredDF = jdbcDF.filter(col("age").gt(25)); //按照姓名进行分组,并统计每组的人数 Dataset<Row> groupedDF = filteredDF.groupBy("name").count(); groupedDF.show(); ``` 以上就是使用Java代码实现SparkSQL操作数据库的步骤。通过这些步骤,我们可以轻松地读取和操作数据库中的数据,并使用SparkSQL进行数据分析和处理。 ### 回答3: Spark SQL 是 Apache Spark 提供的一个模块,允许我们使用 Structured Data 的方式来查询和操作数据。它支持将 SQL 查询转变为 Spark 的 RDD,并可以在 Spark 中直接运行 SQL 查询,使得处理任何数据都变得更加简单和高效。通过 Spark SQL,我们可以使用 SQL 的语法针对不同的数据源,如 Hive、HBase 或 Parquet 文件做数据分析。 而要通过 Java 代码实现 Spark SQL 操作数据库,我们需要使用以下步骤: 1. 首先,需要在代码中引入 Spark SQL 的依赖,通常使用 Maven 或 Gradle 等构建工具进行依赖管理。 2. 接着,需要创建 SparkSession 对象,用于和 Spark 进行交互。 3. 然后,需要将外部数据源(如 JDBC 数据库)的数据读取到 Spark SQL 中,可以使用以下代码实现: ``` Dataset<Row> jdbcDF = sparkSession.read() .format("jdbc") .option("url", "jdbc:mysql://localhost/testdb") .option("dbtable", "mytable") .option("user", "root") .option("password", "mypassword") .load(); ``` 其中,`format` 参数用于指定要加载的数据源类型,`url` 参数用于指定数据库连接地址,`dbtable` 参数用于指定要读取的数据表,`user` 和 `password` 参数用于指定数据库的登录信息。 4. 然后,我们就可以对读取到的数据进行 SQL 查询,例如: ``` jdbcDF.createOrReplaceTempView("mytable"); Dataset<Row> resultDF = sparkSession.sql("SELECT * FROM mytable WHERE age > 18"); ``` 其中,`createOrReplaceTempView` 方法用于将读取到的数据集注册为一张表格,`sql` 方法用于执行 SQL 查询。该查询返回的结果会被封装为一个 Dataset<Row> 对象。 5. 最后,我们可以将查询结果保存到外部数据源中,例如: ``` resultDF.write() .format("jdbc") .option("url", "jdbc:mysql://localhost/testdb") .option("dbtable", "result_table") .option("user", "root") .option("password", "mypassword") .save(); ``` 这段代码将查询结果保存到 MySQL 数据库的 `result_table` 表中。 通过以上步骤,我们就可以使用 Java 代码实现 Spark SQL 操作数据库的功能了。当然,在实际使用中,我们还需要处理一些异常情况,如连接、SQL 语法错误等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值