Spark读取csv文件,清洗后存入Hive库中

前言:我的依赖文件和hive-site.xml文件在这篇文章末尾,仅供参考,这里就不贴了。SparkSQL抽取Mysql全量数据到Hive动态分区表中

配置好相关依赖,然后将集群中的hive-site.xml文件复制一份放在项目中的resources目录下。

import org.apache.spark.rdd.RDD
import org.apache.spark.sql.SparkSession

import scala.util.matching.Regex

object A_my_rush {
  def main(args: Array[String]): Unit = {

    val spark: SparkSession = SparkSession
      .builder()
      .appName("A_my_rush")
      .master("local[*]")
      .enableHiveSupport()  //注意添加hive支持
      .getOrCreate()

    import spark.implicits._  //导入隐式转换,注意这个spark是我上头定义的spark,不是系统的。


    //读取本地csv文件
    val rdd: RDD[String] = spark.sparkContext.textFile(
      "C:\\Users\\Administrator\\Desktop\\Spark练习题\\my_exam_A\\shoping.csv"
    )


   //进行清洗操作,你们不用知道干了什么,就是清洗过滤
    rdd
      .filter(action => {
        val datas: Array[String] = action.split(",")
        var data_isGood: Boolean = datas.length == 8
        for (i <- datas) {
          if (i == "" || i == null) {
            data_isGood = false
          }
        }
        data_isGood
      })
      .map((_, 1))
      .groupByKey()
      .keys
      .map(action => {

        val datas: Array[String] = action.split(",")

        var result = ""
        var num = 0
        var fuhao = ","

        val event_time_pattern: Regex = "[0-9]{4}-[0-9]{2}-[0-9]{2}".r

        val detail_time_pattern: Regex = "[0-9]{2}:[0-9]{2}:[0-9]{2}".r

        for (i <- datas) {

          var tmp: String = i

          if (num == 0) {

            val event_time: String =
              event_time_pattern.findAllIn(tmp).mkString(",").split(",")(0)

            val detail_time: String =
              detail_time_pattern.findAllIn(tmp).mkString(",").split(",")(0)

            tmp = event_time + "," + detail_time

          }

          if (num == 4) {
            val arr: Array[String] = tmp.split("[.]")
            var str = ""
            var count = 0
            var s = "|"
            for (i <- arr) {
              if (arr.length - 1 == count) {
                s = ""
              }
              str += i
                .replaceFirst(
                  i.charAt(0).toString,
                  i.charAt(0).toUpper.toString
                ) + s
              count += 1
            }
            tmp = str
          }

          if (num == 7) {
            fuhao = ""
          }

          result += tmp + fuhao

          num += 1

        }
        result
      })
      .toDF()  //关键部分:转换为dateframe,方便进行后续的sparkSql操作
      .createOrReplaceTempView("rush_data") //创建临时表
 

    //利用sparkSql在hive中创建一个表
    spark.sql("""
        |create table if not exists mydb.shop(
        |event_time string,  
        |detail_time string,  
        |order_id string,  
        |product_id string,  
        |category_id string,  
        |category_code string,
        |brand string,  
        |price string,
        |user_id string)
        |row format delimited fields terminated by '\t'
        |""".stripMargin)

   
    /*
       关键部分:
      上面的数据清洗完以后,我创建了临时表rush_data,注意,当你把这个数据转换成dateframe时,
      每一行数据只会变成一个字段,并且字段名叫: value ,所以我们要将其分隔开。
      很好办,根据你的分隔符来使用 split 函数就能分出来,按你想要的顺序依次排 
      好就行了,前提是你每一行的数据长度都一样,不要会报错,下标越界嘛,懂得懂得,我上面做了清 
      洗,所以可以保证长度一样 
   */
    spark.sql("""
        |select 
        |split(value,",")[0] event_time,  
        |split(value,",")[1] detail_time,  
        |split(value,",")[2] order_id,  
        |split(value,",")[3] product_id,  
        |split(value,",")[4] category_id,  
        |split(value,",")[5] category_code,  
        |split(value,",")[6] brand,  
        |split(value,",")[7] price,
        |split(value,",")[8] user_id
        |from rush_data
        |""".stripMargin).createOrReplaceTempView("data")

   //将数据插入上面创建的表中,检查是否成功插入,完成
    spark.sql("""
        |insert into table mydb.shop
        |select * from data
        |""".stripMargin)

    spark.stop()
  }
}

  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
在将 Pandas DataFrame 存储到 Hive 之前,需要先将其转换为 Spark DataFrame。可以使用 PySpark 的 SQLContext 或 SparkSession 对象创建 Spark DataFrame。假设已经创建了一个名为 `pandas_df` 的 Pandas DataFrame,然后可以执行以下步骤将其存储到 Hive : 1. 导入必要的和模块: ```python from pyspark.sql import SparkSession, SQLContext ``` 2. 创建 SparkSession 对象: ```python spark = SparkSession.builder \ .appName("pandas_to_hive") \ .config("spark.sql.warehouse.dir", "/user/hive/warehouse") \ .enableHiveSupport() \ .getOrCreate() ``` 其,`appName` 是应用程序名称,`config` 指定了 Hive 数据仓的路径,`enableHiveSupport` 用于启用 Hive 支持。 3. 将 Pandas DataFrame 转换为 Spark DataFrame: ```python spark_df = spark.createDataFrame(pandas_df) ``` 4. 将 Spark DataFrame 存储到 Hive : ```python spark_df.write \ .mode("overwrite") \ .saveAsTable("database_name.table_name") ``` 其,`mode` 指定了写入模式,`saveAsTable` 将数据写入到指定的表,如果表不存在,则会自动创建。 完整示例代码如下: ```python from pyspark.sql import SparkSession, SQLContext import pandas as pd # 创建 SparkSession 对象 spark = SparkSession.builder \ .appName("pandas_to_hive") \ .config("spark.sql.warehouse.dir", "/user/hive/warehouse") \ .enableHiveSupport() \ .getOrCreate() # 读取 Pandas DataFrame pandas_df = pd.read_csv("path/to/csv/file.csv") # 将 Pandas DataFrame 转换为 Spark DataFrame spark_df = spark.createDataFrame(pandas_df) # 将 Spark DataFrame 存储到 Hive spark_df.write \ .mode("overwrite") \ .saveAsTable("database_name.table_name") ``` 请根据实际情况修改代码的参数和路径。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月亮给我抄代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值