AmosCloud

Library

Have a Question?

If you have any question you can ask below or enter what you are looking for!

Hive_day04_SparkSQL

hive

1. hive的运行参数

  • 在Hive的客户端命令行中可以使用set查看所有的配置
  • 可以使用set 配置名=配置值;临时修改配置,这个配置只在当前的客户端生效
  • 如果想要配置永久生效,可以在hive-site.xml中添加配

2. user defind function

  • hive本身已经提供了非常强大的函数库
  • 几乎可以在hive中做各种类型的数据处理操作
  • 但是有时遇到一些复杂的逻辑,hive本身的函数不能满足功能,这是hive提供了UDF的方式,可以让用户自己编写函数,并且注册到hive中在sql中使用
  1. 创建maven项目引入hive依赖
  2. 写一个类继承org.apache.hadoop.hive.ql.exec.UDF
  3. 类中写一个方法(方法名为evaluate),用来实现函数想执行的逻辑
public class DateFormatUDF extends UDF {
    //转换日期格式
    public String evaluate(String date) {
        try {
            SimpleDateFormat parser = new SimpleDateFormat("dd/MMM/yyyy:HH:mm:ss", Locale.US);
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            return formatter.format(parser.parse(date));
        } catch (ParseException e) {
            return "0000-00-00 00-00-00";
        }
    }
}
  1. 项目打成Jar放在集群上
  2. 在hive中注册并使用函数
    create temporary function my_df as "com.xahj.hive.DateFormatUDF" using jar "hdfs://bd0201:9000/udf/dateFormatUDF.jar";

SparkSQL

  • spark的一个专门处理结构化数据的模块

  • 程序入口SparkSession

  • 数据抽象DataFrame或者Dataset

在spark1.6.0之后,DF变成了DS的一个特殊形态
type DataFrame = Dataset[Row]

1. SparkCore和SparkSQL数据抽象的转换

  1. rdd转df

    //导入隐式转换
    import spark.implicits._
    // 将一个元组泛型的RDD转换成DF时,可以设置元组每一个元素的列名
    rdd:RDD[(x1,x2,x3)]
    .toDF("列名1","列名2","列名3")
    // 也可以不起列名,DF会自动带列名
  2. rdd转ds

    //导入隐式转换
    import spark.implicits._
    //DS通常以样例类作为泛型
    // 1.准备样例类
    case class WebLog(ip: String, time: String, rCode: Int, down: String)
    // 2.将RDD转为样例类泛型
    rdd1:RDD[(String,String,Int,String)]
    =>
    rdd2:RDD[WebLog]
    =>
    val ds:Dataset[WebLog] = rdd2.toDS
    //DS可以自动将样例类的属性映射成表的字段,来完成sql操作
    ds.map filter      (RDD操作)
    ds.show   createOrReplaceTempView   (DF操作)
  3. df转ds

df本身就是 Dataset[Row]
如果df要转ds,不需要任何操作他本身就是ds
但是通常我们希望df转成ds时,可以给ds加上一个样例类作为泛型

//df.as[样例类]  这个样例类的数据型要和df的列信息匹配
df1.as[WebLog]
  1. ds转df
    ds2.toDF()

  2. df、ds转rdd
    .rdd

2. SparkSQL的输入输出

  • sparkSQL 默认使用parquet格式进行数据的输入输出
  • sparkSQL 已经提供了parquet、json、csv、text、jdbc等常见的数据格式输入输出

    2.1 输入

sparkSession.read.format("").load("path")

2.2 输出

df.write.format("").save("path")