SparkSQL将计算数据写入Mysql中

本文详细介绍使用SparkSQL将数据写入MySQL数据库的过程。通过创建并行化RDD,定义Schema,映射Row,并最终利用JDBC连接将DataFrame数据追加到MySQL数据库中。示例代码展示了如何配置SparkConf,创建SparkContext和SQLContext,以及如何设置数据库连接属性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码如下:

package com.itunic.sql

import java.util.Properties
import org.apache.spark.sql.{Row, SQLContext}
import org.apache.spark.sql.types.{IntegerType, StringType, StructField, StructType}
import org.apache.spark.{SparkConf, SparkContext}

/**
  * Created by c on 2017/1/3.
  *  Spark SQL
  *  将数据写入到MySQL中
  * by me:
  * 我本沉默是关注互联网以及分享IT相关工作经验的博客,
  * 主要涵盖了操作系统运维、计算机编程、项目开发以及系统架构等经验。
  * 博客宗旨:把最实用的经验,分享给最需要的你,
  * 希望每一位来访的朋友都能有所收获!
  */
object JdbcRDD {
  def main(args: Array[String]) {
    val conf = new SparkConf().setAppName("JdbcRDD").setMaster("local")
    val sc = new SparkContext(conf)
    val sqlContext = new SQLContext(sc)
 //通过并行化创建RDD
    val personRDD = sc.parallelize(Array("1 tom 5", "2 jerry 3", "3 kitty 6")).map(_.split(" "))
 //通过StructType直接指定每个字段的schema
    val schema = StructType(
      List(
        StructField("id", IntegerType, true),
        StructField("name", StringType, true),
        StructField("age", IntegerType, true)
      )
    )
 //将RDD映射到rowRDD
    val rowRDD = personRDD.map(p => Row(p(0).toInt, p(1).trim, p(2).toInt))
 //将schema信息应用到rowRDD上
    val personDataFrame = sqlContext.createDataFrame(rowRDD, schema)
 //创建Properties存储数据库相关属性
    val prop = new Properties()
    prop.put("user", "root")
    prop.put("password", "root")
 //将数据追加到数据库
    personDataFrame.write.mode("append").jdbc("jdbc:mysql://192.168.155.1:3306/test", "test.t_person", prop)
 //停止SparkContext
    sc.stop()
  }
}

打包并发布到spark集群

$SPARK_HOME/bin/spark-submit \
--class com.itunic.sql.JdbcRDD \
--master spark://ResourceManagerServer1:7077 \
--jars /usr/local/spark-1.5.2-bin-hadoop2.6/mysql-connector-java-5.1.35-bin.jar \
--driver-class-path /usr/local/spark-1.5.2-bin-hadoop2.6/mysql-connector-java-5.1.35-bin.jar \
/root/spark-mvn-1.0-SNAPSHOT.jar
<think>好的,用户想要查找基于Hive的网约车出行数据分析的架构图示例或设计方案。首先,我需要回忆Hive在数据仓库中的典型应用场景,以及网约车行业的数据分析需求。网约车数据通常包括订单信息、用户行为、司机信息、地理位置等,这些数据量大,适合用Hive进行批处理分析。接下来,参考用户提到的引用内容。引用[1]提到数据集市层使用Hive,这可能在架构中作为数据存储和处理的一部分。引用[2]涉及数据同步平台的架构,使用Canal和MQ,这可能与数据采集和传输相关,需要整合到整体架构中。 用户可能需要一个分层的架构图,从数据采集到处理再到应用层。需要考虑数据源(如MySQL、日志、GPS数据)、数据抽取(Canal、Flume)、数据传输(MQ、Kafka)、数据存储(Hive、HDFS)、数据处理(ETL、Spark/Flink)、数据仓库分层(ODS、DWD、DWS、ADS)、数据可视化(报表、BI工具)等模块。 需要确保架构图各层之间的流程清晰,比如原始数据通过Canal解析binlog到MQ,再通过ETL到Hive的ODS层,然后分层处理,最后到数据集市层供应用使用。同时,要考虑性能优化,比如分区、索引、压缩等Hive优化手段,以及可能的实时处理部分,但用户主要关注Hive,可能以批处理为主。可能还需要举例说明架构中的每个组件如何协作,比如数据如何从MySQL到Hive,如何处理成报表数据。此外,用户可能需要架构设计的关键点,如数据分层、性能优化、数据同步等,这些都需要在回答中详细说明,并给出示例架构图的结构。 最后,生成相关问题,帮助用户深入理解,比如数据分层的好处、Hive优化方法、与其他组件的集成等。</think>### Hive网约车出行数据分析架构设计方案 网约车数据分析通常涉及订单、用户、司机、地理位置等多维度数据,基于Hive的典型架构可分为以下层次: **1. 数据源层** - **数据来源**:MySQL业务库(订单、用户信息)、日志文件(App行为日志)、GPS轨迹数据、第三方数据(天气、交通) - **数据同步**:通过Canal解析MySQL binlog并写入Kafka[^2],日志数据通过Flume采集至HDFS **2. 数据存储层** - **原始数据存储**:HDFS存储原始日志文件、GPS轨迹数据 - **结构化存储**:Hive表存储清洗后的结构化数据,按时间分区(例如:`ods.ride_order`每日分区表) **3. 数据处理层** ```sql -- 示例:创建DWD层订单事实表 CREATE TABLE dwd.ride_order_fact ( order_id STRING, user_id STRING, driver_id STRING, start_geo STRING, end_geo STRING, distance DOUBLE, duration INT, fare DECIMAL(10,2) ) PARTITIONED BY (dt STRING); ``` - **ETL流程**: - **ODS层**:原始数据贴源存储 - **DWD层**:数据清洗、维度退化(如将用户ID关联到用户属性) - **DWS层**:按主题聚合(例如:区域高峰时段分析表) - **ADS层**:面向应用的数据集市(如司机收入报表、热门路线统计) **4. 数据服务层** - **查询引擎**:Presto/SparkSQL实现交互式查询 - **输出方式**:结果数据导出至MySQL/Redis供报表系统使用[^1],或通过Superset/Tableau可视化 $$ \text{架构核心指标} = \frac{\text{日均订单量}}{\text{司机活跃数}} \times \text{平均接单时长} $$ **关键设计点**: 1. 采用**动态分区**处理时间序列数据 2. 在**DWS层预计算**高频查询指标(如24小时订单分布) 3. 使用**ORCFile格式**+**Zlib压缩**优化存储效率 4. 通过**Hive LLAP**实现亚秒级查询响应
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值