Spark-SQL笔记一

认知误区

  1. Spark SQL是处理结构化数据,并不是仅仅能够处理SQL。
  2. Spark SQL是能够处理多种不同数据源的数据(text、json、parquet、orc、hive、jdbc)。
  3. Spark SQL 是在Spark里的概念,而Hive on Spark 是在Hive里面的概念。所以,Hive on Spark不是Spark SQL,Hive刚开始时底层执行引擎只有一个:MR,后期支持:Tez、Spark。

Dataset 和 DataFrame

spark1.0出现了SchemaRDD(可理解为Table表),
spark1.2\3出现了DataFrame,spark1.6出现了Dataset。
即先出现的DataFrame,后出现的Dataset。

Dataset:A Dataset is a distributed collection of data.
Dataset API is available in Scala and Java. Python does not have the support for the Dataset API.
DataFrame :A DataFrame is a Dataset organized into named columns.
In Scala and Java, a DataFrame is represented by a Dataset of Rows.

type DataFrame = Dataset[Row]

注意返回类型:

val df: DataFrame = spark.read.text("data/people.txt")
val ds: Dataset[String] = spark.read.textFile("data/people.txt")

shell 连接 hive 库

spark-sql连接hive的准备:

1.cp $HIVE_HOME/conf/hive-site.xml $SPARK_HOME/conf
2.指定mysql-connect-java路径,注意不要放到spark的jars目录下,不利于后期spark升级,可以用–jars和–driver-class-path加入进去。

用spark-shell启动:
spark-shell --jars /home/hadoop/app/hive/lib/mysql-connector-java-5.1.28.jar,/bigdata/apps/hadoop/share/hadoop/common/hadoop-lzo-0.4.21-SNAPSHOT.jar 

注意:这里加入了lzo的包,因为之前手动编译lzo支持分片,这里也要引用进来,不然报错!
执行:spark.sql(“select * from test_db.test”).show(3) //show(int,boolean) 若字符过长,默认只展示前20个字符

用spark-sql启动:
spark-sql --jars /home/hadoop/app/hive/lib/mysql-connector-java-5.1.28.jar,/bigdata/apps/hadoop/share/hadoop/common/hadoop-lzo-0.4.21-SNAPSHOT.jar --driver-class-path /home/hadoop/app/hive/lib/mysql-connector-java-5.1.28.jar

注意:这里需要加上–driver-class-path,为driver端指定jar路径
执行:可以在里面直接写sql语句了。

读取各种数据源

hive

准备工作:
1.hadoop 的 core-site.xml,hive 的 hive-site.xml 拷贝到 project下的 resource目录下。
2. pom.xml添加如下依赖:

<dependency>
		<groupId>org.apache.spark</groupId>
		<artifactId>spark-hive_2.11</artifactId>
		<version>${spark.version}</version>
</dependency>
System.setProperty("HADOOP_USER_NAME","hadoop")   //指定用户登录hive

val spark = SparkSession.builder().appName("ForamtApp").master("local[2]")
                .config("hive.metastore.uris", "thrift://192.168.22.147:9083")
                .enableHiveSupport()  //一定要写这一句
                .getOrCreate()

注意:hive.metastore.uris可以在代码设置也可以在hive-site.xml设置,若是默认端口9083可以不设置。

使用示例:

  def hive(spark: SparkSession) = {
    spark.sql("show databases").show()
    spark.sql("insert into table test_db.test2 select * from test_db.test")
//    val df = spark.sql("select * from test_db.test")
//    df.coalesce(1).write.saveAsTable("test_db.test2") //会有OOM的风险,不用!
  }

text文件

def text(spark: SparkSession) = {
    import spark.implicits._
    val df: DataFrame = spark.read.format("text")
      .load("data/people.txt") //此处返回的是DataFrame
    //      .load("D:\\spark_code\\ruozedata-spark-flink\\data\\wc.data")
    //    spark.read.text("data/people.txt").show()   //简写方式
    //    df.show()
    df.rdd.map(x => {
      val str: String = x.getString(0)
      val words = str.split(",")
      (words(0), words(1))
    }).foreach(println)


    val ds: Dataset[String] = spark.read.textFile("data/people.txt")
    //ds.show()
    val resultDS: Dataset[String] = ds.map(x => {
      val strings: Array[String] = x.split(",")
      strings(0)
    })
    resultDS.write
      .option("compression", "gzip") //设置压缩
      .mode(SaveMode.Overwrite) //覆盖目录
      .format("text").save("out") //思考:此处为什么只能输出一列,只需转为rdd就行,如下。
    //resultDS.write.text("out2")
    FileUtils.deleteTarget("out2", spark.sparkContext)
    ds.rdd.map(x => {
      val words = x.split(",")
      (words(0), words(1))
    }).saveAsTextFile("out2")
    //.saveAsTextFile("out2", classOf[GzipCodec])
  }

json文件

  def json(spark: SparkSession) = {
    import spark.implicits._
    val df = spark.read.format("json").load("data/people.json")
    //    df.printSchema()
    //    df.select("appId", "user", "version")
    val resultDS: Dataset[Row] = df.select(df("appId"), df("user")).filter('appId === "2")
    //      .where('appId === "2")
    resultDS.write
      .mode(SaveMode.Overwrite) //覆盖目录
      .format("json").save("out")
  }

csv文件

  def csv(spark: SparkSession) = {
    import spark.implicits._
    val df = spark.read.option("header", "true") //option配置在org/apache/spark/sql/execution/datasources/csv/CSVOptions.scala中
      .option("sep", ";").format("csv").load("data/people.csv")
    df.select("age", "job").filter($"age" > 20)
      .write.mode(SaveMode.Overwrite)
      .format("json").save("out") //注意:可以csv都进来,json写出去!
  }

jdbc

def jdbc(spark: SparkSession) = {
    import spark.implicits._
    val jdbcDF = spark.read
      .format("jdbc")
      .option("url", "jdbc:mysql://master:3306")
      .option("dbtable", "test_db.topn")
      .option("user", "root")
      .option("password", "123456")
      .load()
    jdbcDF.show()
    jdbcDF.filter('cnt === 1)
      .write.format("jdbc")
      .option("url", "jdbc:mysql://master:3306")
      .option("dbtable", "test_db.topn2")
      .option("user", "root")
      .option("password", "123456")
      .mode(SaveMode.Overwrite)
      .save()
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值