【SparkSQL】JDBC Data Source - 从MySQL中读取数据

下面是一个使用SparkSQL从MySQL中读取数据,并转换成一个本地Map输出到控制台的示例程序

val spark = SparkSession
      .builder()
      .appName(this.getClass.getSimpleName.stripSuffix("$"))
      .master("local[*]")
      .config("spark.default.parallelism", 8)
      .config("spark.sql.shuffle.partitions", 8)
      .getOrCreate()

    import spark.implicits._

    val jdbcHost = "192.168.1.2"
    val jdbcPort = 3306
    val jdbcDbName = "test_db"
    val jdbcTable = "cus_timezone_info"

    val jdbcUrl = s"jdbc:mysql://${jdbcHost}:${jdbcPort}/${jdbcDbName}?serverTimezone=UTC&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false"

    val jdbcDF = spark
      .read
      .format("jdbc")
      .option("url", jdbcUrl)
      .option("dbtable", jdbcTable)
      .option("user", "root")
      .option("password", "******")
      //用户自定义schema,可以只指定部分字段,其余字段SparkSQL会自动映射
      .option("customSchema", "status SHORT, sort_no INTEGER")
      //dbtable 和 query 不可以同时指定
      //.option("query", "select c1, c2 from t1")
      .load()

    //jdbcDF.printSchema()

    jdbcDF.createOrReplaceTempView("v_data")

    //GROUP BY是为了实现去重, 效率比DISTINCT高
    val filteredDF = spark.sql(
      """
        |SELECT
        |  company_id,
        |  trim(timezone_id) AS timezone_id
        |FROM v_data
        | WHERE status = 0
        |GROUP BY company_id, trim(timezone_id)
        |""".stripMargin)

    //filteredDF.show(200, false)

    val companyTimezoneIdMap = filteredDF.map(row => {
      val company_id = row.getAs[String]("company_id")
      val timezone_id = row.getAs[String]("timezone_id")

      (company_id, timezone_id)
    }).collect()
      .toMap

    companyTimezoneIdMap.foreach{
      case (companyId, timezoneId) => println(s"companyId: ${companyId}, timezoneId: ${timezoneId}")
    }

    spark.close()
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值