spark-sql从结构化数据中读取数据

785 阅读2分钟

1、从csv中读取文件,改文件没有表头

import org.apache.spark.sql.types.{DataTypes, StructType}
import org.apache.spark.sql.{DataFrame, SparkSession}

object CreateDataFrameFromCSV {

  def main(args: Array[String]): Unit = {
    val spark: SparkSession = SparkSession.builder().appName(this.getClass.getSimpleName).master("local[*]").getOrCreate()
    //  方式1、 从csv中读取数据,但是该数据是没有表头的
//    val df: DataFrame = spark.read.csv("data/stu.txt")

//    +---+---+---+---+----+
    //|_c0|_c1|_c2|_c3| _c4|
    //+---+---+---+---+----+
    //|  1| 张飞| 21| 北京|80.0|
    //|  2| 关羽| 23| 北京|82.0|
    //|  3| 赵云| 20| 北京|88.6|
    //|  4| 刘备| 26| 北京|83.0|
    //|  5| 曹操| 30| 北京|90.0|
    //+---+---+---+---+----+
//    df.show()

//    方式2:csv文件(不带header)自定义schema进行创建
    val schema: StructType = new StructType()
      .add("id", DataTypes.IntegerType)
      .add("name", DataTypes.StringType)
      .add("age", DataTypes.IntegerType)
      .add("city", DataTypes.StringType)
      .add("score", DataTypes.DoubleType)

    val df: DataFrame = spark.read.schema(schema).csv("data/stu.txt")
    df.printSchema()
    df.show()
    spark.close()
  
  }
  
}

2、读取csv文件,改文件带表头

import org.apache.spark.sql.{DataFrame, SparkSession}

object CreatDataFrameFromCSVWithHeader {

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

    val spark: SparkSession = SparkSession.builder().appName(this.getClass.getSimpleName).master("local[*]").getOrCreate()
//读取表头数据成功,但是类型都是String
    //   root
// |-- id: string (nullable = true)
// |-- name: string (nullable = true)
// |-- age: string (nullable = true)
// |-- city: string (nullable = true)
// |-- score: string (nullable = true)
    val df: DataFrame = spark.read.option("header",true).csv("data/stu2.txt")
    df.printSchema()
    df.show()


//    可以开启 inferSchema = true让框架来对csv中的数据字段进行合理的类型推断.  如果退佃不对,可以自定义Schema
    val df2 = spark.read.option("header",true).option("inferSchema",true).csv("data/stu2.txt")

    df2.printSchema()
    df2.show()
//    数据已parquet格式写出
    df2.write.parquet("/data/output")
    spark.close()
  }
}

2、读取parquet文件

spark.read.parquet("data/output")

3、从jdbc中读取数据

import java.util.Properties

import org.apache.spark.sql.{DataFrame, SparkSession}

object CreateDataFrameFromJDBC {

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


    val spark: SparkSession = SparkSession.builder().appName(this.getClass.getSimpleName).master("local[*]").getOrCreate()


    val props = new Properties()
    props.setProperty("user","root")
    props.setProperty("password","root")

    val df: DataFrame = spark.read.jdbc("jdbc:mysql://127.0.0.1:3306/test","company_info",props)

    df.show()
    spark.close()
  }
}

4、从Hive中读取数据

在pom.xml文件中添加
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-hive_2.11</artifactId>
            <version>2.4.4</version>
        </dependency>
import org.apache.spark.sql.{DataFrame, SparkSession}

object CreateDataFrameFromHive {

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

    val spark: SparkSession = SparkSession
      .builder().appName(this.getClass.getSimpleName).master("local[*]")
//      启用hive支持,需要调用enableHiveSupport。还需要添加一个依赖 spark-hive
//      默认sparksql内置了自己的hive
//      如果程序能从classpath中加载到hive-site.xml配置文件,那么它访问的hive源数据库就不是内置的了,而是指定的元数据库了
//      如果程序能从classpath中加载到core-site.xml hdfs-site.xml配置文件,那么访问的就不是本地文件系统了,而是配置中指定的hdfs系统了

      .enableHiveSupport()
      .getOrCreate()

    val df: DataFrame = spark.sql("select id,phone from dwt.abc limit 10")

    df.show()
    spark.close()
  }
}