spark通过jdbc的方式连接hive,输出为parquet

首先,我用的是下列方式来连接hive:

def main(args: Array[String]): Unit = {
Class.forName("org.apache.hive.jdbc.HiveDriver").newInstance()
val conf = new SparkConf().setAppName("SOME APP NAME").setMaster("local[*]")

val sc = new SparkContext(conf)

val spark = SparkSession
  .builder()
  .appName("Spark Hive Example")
  .getOrCreate()

val jdbcDF = spark.read
  .format("jdbc")
  .option("url", "jdbc:hive2://34.223.237.55:10000/default")
  .option("dbtable", "students1")
  .option("user", "hduser")
  .option("password", "hadoop")
  //.option("driver", "org.apache.hadoop.hive.jdbc.HiveDriver")
  .load()

println("able to connect------------------")

jdbcDF.show

jdbcDF.printSchema()

jdbcDF.createOrReplaceTempView("std")

val sqlDF = spark.sql("select * from std")
println("Start println-----")
spark.sqlContext.sql("select * from std").collect().foreach(println)
println("end println-----")
sqlDF.show(false)
}

这样确实可以连上hive但是,只能获取到列名,但是获取不到数据。
然后我去网上搜,给出的答案是加fetchsize属性,

   val jdbcDF = spark.read
      .format("jdbc")
      .option("url", "jdbc:hive2://34.223.237.55:10000/default")
      .option("dbtable", "students1")
      .option("user", "hduser")
      .option("password", "hadoop")
      .option("fetchsize", "20")
      //.option("driver", "org.apache.hadoop.hive.jdbc.HiveDriver")
      .load()

结果报数组越界错误,然后我就放弃了这种方法。如果有大佬晓得为啥,欢迎留言,谢谢。
我又用了另一种方法,如下:

def main(args: Array[String]): Unit = {
    Class.forName("org.apache.hive.jdbc.HiveDriver").newInstance()
    val conf = new SparkConf().setAppName("SOME APP NAME").setMaster("local[*]")

    val sc = new SparkContext(conf)
    val spark = SparkSession
      .builder()
      .appName("Spark Hive Example")
      .getOrCreate()

    val sqlContext: SQLContext = spark.sqlContext

    val conn = DriverManager.getConnection("jdbc:hive2:/xxxxxxx:10000/dbname", "username", "password")

    /**
      * 第三步:创建Statement句柄,基于该句柄进行SQL的各种操作;
      */
    val state = conn.createStatement()

    val sql = "select * from data_xy_b_content_asr_nlp limit 100"
    val resultSet = state.executeQuery(sql)
    val rowList = new scala.collection.mutable.MutableList[Row]
    var cRow: Row = null
    //Looping resultset
    while (resultSet.next()) {
      //adding two columns into a "Row" object
      cRow = RowFactory.create(resultSet.getObject(1), resultSet.getObject(2))
      //adding each rows into "List" object.
      rowList += cRow
    }
    //creates a dataframe
    val DF = sqlContext.createDataFrame(sc.parallelize(rowList ,2), getSchema())
    DF.show() //show the dataframe.
    DF.repartition(1).write.parquet("output_path")


  }
  def getSchema(): StructType = {
    val schema = StructType(
      StructField("COUNT", StringType, false) ::
        StructField("TABLE_NAME", StringType, false) :: Nil)

    //Returning the schema to define dataframe columns.
    schema
  }

这种方法就是像连mysql一样,取出来数据后转换成DataFrame,然后再进行操作。
希望对大家有帮助。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spark SQL可以通过DataFrame API或SQL语句来操作外部数据源,包括parquethive和mysql等。其中,parquet是一种列式存储格式,可以高效地存储和查询大规模数据hive是一种基于Hadoop的数据仓库,可以通过Spark SQL来查询和分析;而mysql是一种常见的关系型数据库,可以通过Spark SQL来读取和写入数据。在使用Spark SQL操作外部数据源时,需要先创建DataFrame或注册表,然后通过API或SQL语句来进行数据的读取、过滤、聚合等操作。同时,还可以通过Spark SQL的连接器来实现不同数据源之间的数据传输和转换。 ### 回答2: Spark SQL 是 Apache Spark 中的一个模块,用于在大规模数据集上进行结构化数据处理。它支持多种数据源,并提供了访问、查询和操作这些数据源的功能。 对于外部数据源的操作,Spark SQL 提供了适配器和驱动程序来连接不同的数据源。下面简单介绍一下对于三种常见的数据源(ParquetHive、MySQL)的操作方式: 1. ParquetParquet 是一种列式存储格式,适用于大规模数据存储和分析。对于 Parquet 数据源,Spark SQL 提供了原生的支持,你可以直接使用 `spark.read.parquet()` 方法读取 Parquet 文件,并通过 `write.parquet()` 方法写入 Parquet 文件。Spark SQL 会自动推断 Parquet 文件的模式(schema),你也可以通过指定模式参数来指定具体的模式。 2. HiveHive 是一个数据仓库基础设施,可以在 Hadoop 上进行数据仓库的处理和查询。Spark SQL 可以与 Hive 结合使用,使用 Hive 提供的 metastore 来管理表和模式,通过 HiveQL(Hive 查询语言)来查询和操作 Hive 数据。你可以通过 `spark.sql()` 方法来执行 HiveQL 查询,也可以使用 `registerTempTable()` 方法将一个 Spark DataFrame 注册为一个临时表,然后通过 SQL 语句查询这个临时表。 3. MySQL:MySQL 是一种关系型数据库管理系统,Spark SQL 也可以与 MySQL 进行集成。首先,需要在 Spark 中导入相应的 MySQL 驱动程序,例如 "com.mysql.jdbc.Driver"。然后,通过 `spark.read.format("jdbc")` 方法来读取 MySQL 数据库中的表,你需要指定连接 URL、表名、用户名和密码等参数。使用相同的方式,你也可以将 Spark DataFrame 写入到 MySQL 数据库中。 总结起来,Spark SQL 对于 ParquetHive 和 MySQL 这些外部数据源都提供了直接的支持和集成。通过适配器和驱动程序,你可以使用 Spark SQL 的 API 和功能来读取、写入、查询和操作这些外部数据源中的数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值