Spark读取Hbase数据保存为csv和parquet格式

利用Spark SQL的DataFream 将hbase表数据保存为csv或者parquet格式文件。
代码:
package com.cbp.spark_hbase

import org.apache.hadoop.hbase.HBaseConfiguration
import org.apache.hadoop.hbase.client.Result
import org.apache.hadoop.hbase.io.ImmutableBytesWritable
import org.apache.hadoop.hbase.mapreduce.TableInputFormat
import org.apache.hadoop.hbase.util.Bytes
import org.apache.log4j.{Level, Logger}
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.{DataFrame, Row, SparkSession}
import org.apache.spark.sql.types.{StringType, StructField, StructType}
import scala.collection.mutable.ArrayBuffer

object SparkReadHbaseSaveCsvOrParquet {
  Logger.getLogger("org").setLevel(Level.INFO)

  def main(args: Array[String]): Unit = {
    //外部传参,hbase表名、文件保存路径
    val readName = args(0)
    val outPath = args(1)
    
    val ss = SparkSession.builder().getOrCreate()
    val hconf = HBaseConfiguration.create()
    hconf.set(TableInputFormat.INPUT_TABLE, readName)
    
    val hRdd = ss.sparkContext.newAPIHadoopRDD(hconf,
      classOf[TableInputFormat],
      classOf[ImmutableBytesWritable],
      classOf[Result])
    val columnf = "fpmx"
    val columnNames = Array("xf_nsrsbh", "gf_nsrsbh", "fpdm", "fphm", "fpmxxh", "flbm", "kprq", "kpyf", "spmc", "jldw", "je", "se", "slv", "zfbz", "sjly", "ext")
    val df = hbaseRddToDF(ss, hRdd, columnf, columnNames)
        df.createOrReplaceTempView("fp_mx")
        df.sqlContext.sql(
          s"""
             |select
             |xf_nsrsbh,gf_nsrsbh,fpdm,fphm,fpmxxh,flbm,kprq,kpyf,spmc,jldw,je,se,slv,zfbz,sjly,ext
             |from  fp_mx
             |""".stripMargin)
    df.write.mode("append").csv(outPath)
    //    .parquet(outPath)
    ss.close()
  }

  //RDD转dataDrame方法,三个参数(SparkSession,columnFamily列族,columnNames;列:一个集合)
  def hbaseRddToDF(ss: SparkSession, hbaseRdd: RDD[(ImmutableBytesWritable, Result)], columnFamily: String, columnNames: Array[String]): DataFrame = {
    //通过可变array来封装Array[StructField]属性数组
    val structFields = ArrayBuffer(StructField("row_key", StringType))
    columnNames.foreach(y => {
      structFields.append(StructField(y, StringType))
    })
    //定义schema,StructType是一个case class,可以有多个StructField,源码case class StructType(fields: Array[StructField])
    val dfschema = StructType(structFields.toArray)

    //封装rowRDD
    val rowRdd = hbaseRdd.map(rdd => {
      val values = ArrayBuffer[String](Bytes.toString(rdd._2.getRow))
      columnNames.foreach(columns => {
        values.append(Bytes.toString(rdd._2.getValue(Bytes.toBytes(columnFamily), Bytes.toBytes(columns))))
      })
      Row.fromSeq(values.toSeq)
    })
    //通过createDataFrame方法将rdd转换为dataFrame,两个参数(rowRDD,StructType)
    val rddToDF = ss.createDataFrame(rowRdd, dfschema)
    rddToDF
  }
}

submit提交脚本:
nohup spark-submit \
--master yarn \
--deploy-mode client \
--class com.cbp.spark_hbase.SparkReadHbaseSaveCsvOrParquet \
--driver-memory 4G \
--executor-memory 20G \
--executor-cores 4 \
--num-executors 20 \
--conf spark.default.parallelism=240 \
--conf spark.speculation=true \
--conf spark.speculation.interval=100 \
--conf spark.speculation.quantile=0.75 \
--conf spark.speculation.multiplier=1.5 \
--conf spark.storage.memoryFraction=0.2 \
--conf spark.shuffle.memoryFraction=0.4 \
--conf spark.shuffle.service.enabled=true \
com.cbp.test-1.0-SNAPSHOT.jar \
"test" \
"./test1" \
> ./log.file 2>&1 &
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值