在工作中经常使用Spark处理 非标准化的数据,将数据处理成转换为 DataFrame对象。并从DataFrame对象中创建视图,构建数据表,以数据表的形式保存最终数据。
关键步骤:a、通过case class定义schema。b、解析数据,得到包含case class对象的RDD。 c、将RDD转换为DataFrame对象。d、指定数据库,新建数据表。通过DataFrame对象创建视图,讲视图数据插入到数据表中。
知识点
1、Spark如何支持Hive操作
2.x版本
import org.apache.spark.sql.SparkSession//case classcase class PredictResult(userid:String, item_id:String,pctr:Float, pcvr:Float, pay_label:Int,click_label:Int)// 新建会话val sparkSession = SparkSession.builder().appName("mlx_feature_process").config("hive.exec.dynamic.partition", true).config("hive.exec.dynamic.partition.mode", "nonstrict").enableHiveSupport().getOrCreate()// 读取数据,解析数据。构建case class 的RDD。val sc = sparkSession.sparkContextval predictSample = sc.textFile(...).map(r=>{PredictResult(r)})// RDD 转化为 DataFrame对象,并创建视图import sparkSession.implicits._predictSample.toDF().createOrReplaceTempView("predict_table")// 数据表名val tableName = "predict_sample_result_"+model// 指定使用的数据库sparkSession.sql("use ba_xxx")// 执行建表操作sparkSession.sql(createTableSql(tableName))// 执行数据建表操作sparkSession.sql(s"""|alter table $tableName drop if exists partition(dt=$date)|""".stripMargin)sparkSession.sql(s"""|insert into $tableName partition(dt=$date)|select userid,item_id,item_type,|pctr,pcvr,pay_label,click_label, ts|from predict_table""".stripMargin)
建表语句:
def createTableSql(tableName:String): String ={val sqlStr1 =s"""|CREATE TABLE IF NOT EXISTS $tableName(| `userid` string comment 'userid',| `item_id` string comment 'item_id',| `item_type` string comment 'item_type',| `pctr` float comment '模型预测ctr',| `pcvr` float comment '模型预测cvr',| `pay_label` int comment '支付标签,-1表示无效',| `click_label` int comment '点击标签',| `ts` string comment '时间戳'|) COMMENT '推荐报表'|PARTITIONED BY(dt string COMMENT "yyyyMMdd,日期分区")|STORED AS ORC""".stripMarginsqlStr1}
2、DataSet、DataFrame如何转换成数据表
使用隐式强转
// 转换,创建视图import sparkSession.implicits._predictSample.toDF().createOrReplaceTempView("predict_table")
3、Spark如何支持HiveSql操作
和正常Sql操作没有任务区别
使用 sparkSession.sql(sql语句) 执行sql任务。
FAQ
1、为什么使用数据库表,而不使用HDFS存储原始数据?
格式化的标准数据,便于管理、维护。
