SparkSQL读取数据源

本文介绍如何使用 Spark SQL 进行数据处理,包括从 JSON 和文本文件读取数据、使用编程方式指定架构、使用反射推断模式、写入 Parquet 文件及读取 Parquet 数据等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.sql.SQLContext
import org.apache.spark.sql.DataFrame
import org.apache.spark.sql.types.{StringType, StructField, StructType}
import org.apache.spark.sql.Row
import com.bonree.sdk.behavior.common.Constant


/**
  * Created by Administrator on 2016/7/11.
  */
object SparkSQL{
  def main(args: Array[String]) {
    val conf = new SparkConf().setAppName("Simple Application").setMaster("local")
    val sparkContext = new SparkContext(conf)
    val sqlContext = new SQLContext(sparkContext)
//    import sqlContext.createSchemaRDD
    /*
    sparkSQL读取json文件
     */
    val jsonPath = "e:/data/text.txt"
    val dataFrame = sparkSqlReadJson(sqlContext, jsonPath)

    val txtPath = "e:/data/tt.txt"
    sparkSQLReadTxt(sqlContext, sparkContext, txtPath)
    sparkSQLInferrSchemaReadTxt(sqlContext, sparkContext, txtPath)

    val parquetPath = "e:/data/user.parquet"
    sparkSqlWriteParquet(sqlContext, parquetPath, jsonPath)
    sparkSQLReadParquet(sqlContext, parquetPath)


  }

  /**
    * 声明一个schame模型类
    * @param name
    * @param age
    */
  case class Person(name:String,age:String)
  /**
    * sparkSQL读取json文件
    * @param sqlContext
    * @param path
    */
  def sparkSqlReadJson(sqlContext:SQLContext, path:String): DataFrame ={
    import sqlContext.implicits._
    val dataFrame = sqlContext.read.json(path)
    return dataFrame
  }

  /**
    * Programmatically Specifying the Schema(以编程方式指定架构) 它需要在程序中运用字符串转换成Schema模型
    * 然后通过createDataFrame将RDD和模型关联,再通过registerTempTable注册表名
    * @param sqlContext
    * @param sparkContext
    * @param path
    */
  def sparkSQLReadTxt(sqlContext: SQLContext,sparkContext: SparkContext, path:String): Unit ={
    val schemaString = "name age"
    val schema = StructType(schemaString.split(" ").map(fieldName => StructField(fieldName, StringType, true)))
    val people = sparkContext.textFile(path).map(_.split(",")).map(p => Row(p(0), p(1).trim))
    val peopleDataFrame = sqlContext.createDataFrame(people, schema)
    peopleDataFrame.registerTempTable("Person")
    val results = sqlContext.sql("SELECT name, age FROM Person WHERE age >= 13")
    results.map(t => "Name: " + t(0)).collect().foreach(println)
  }


  /**
    * Inferring the Schema Using Reflection(使用反射推断模式) 使用这种方式需要先定义好schema的模式然后使用toDF函数转换成DataFrame
    * 然后运用 registerTempTable注册零时表名
    * @param sqlContext
    * @param sparkContext
    * @param path
    */
  def sparkSQLInferrSchemaReadTxt(sqlContext:SQLContext, sparkContext: SparkContext, path:String): Unit ={
    import sqlContext.implicits._
    val peoples = sparkContext.textFile(path).map(_.split(Constant.SPLIT_WORD)).map(people => Person(people(0), people(1))).toDF()
    peoples.registerTempTable("people")
    val result = sqlContext.sql("select * from people")
    result.collect().foreach(println)
  }

  /**
    * 读取json中数据 将数据写入parquet中
    * @param sqlContext
    * @param parquetPath
    * @param jsonPath
    */
  def sparkSqlWriteParquet(sqlContext:SQLContext, parquetPath:String, jsonPath:String): Unit ={
    import sqlContext.implicits._
    val dataFrame = sqlContext.read.json(jsonPath)
    dataFrame.select("name", "age").write.format("parquet").save(parquetPath)
  }

  /**
    * sparkSQL读取 Parquet数据
    * @param sqlContext
    * @param path
    */
  def sparkSQLReadParquet(sqlContext:SQLContext, path:String): Unit ={
    val parquetData = sqlContext.read.parquet(path)
    parquetData.registerTempTable("parquetData")
    val result = sqlContext.sql("select * from parquetData")
    result.foreach(println)
  }

}


Spark SQL支持多种数据源,包括Hive、JSON、CSV、Parquet、JDBC等。在使用多个数据源时,可以使用Spark SQL提供的API来实现数据的读取、转换和写入。下面是一个使用多个数据源的示例代码: ```scala import org.apache.spark.sql.SparkSession object MultiDataSourceExample { def main(args: Array[String]): Unit = { val spark = SparkSession.builder() .appName("MultiDataSourceExample") .master("local[*]") .getOrCreate() // 从Hive表读取数据 val df1 = spark.sql("SELECT * FROM hive_table") // 从JSON文件读取数据 val df2 = spark.read.json("path/to/json/file") // 从CSV文件读取数据 val df3 = spark.read.csv("path/to/csv/file") // 从Parquet文件读取数据 val df4 = spark.read.parquet("path/to/parquet/file") // 从JDBC数据源读取数据 val df5 = spark.read.format("jdbc") .option("url", "jdbc:mysql://localhost:3306/test") .option("dbtable", "table_name") .option("user", "root") .option("password", "password") .load() // 对数据进行转换和处理 val result = df1.union(df2).join(df3, Seq("id")).filter("age > 18").groupBy("gender").count() // 将结果写入到Hive表中 result.write.saveAsTable("hive_table_result") // 将结果写入到JSON文件中 result.write.json("path/to/json/file/result") // 将结果写入到CSV文件中 result.write.csv("path/to/csv/file/result") // 将结果写入到Parquet文件中 result.write.parquet("path/to/parquet/file/result") // 将结果写入到JDBC数据源中 result.write.format("jdbc") .option("url", "jdbc:mysql://localhost:3306/test") .option("dbtable", "result_table") .option("user", "root") .option("password", "password") .mode("overwrite") .save() spark.stop() } } ``` 在上面的示例代码中,我们使用了Hive表、JSON文件、CSV文件、Parquet文件和JDBC数据源。首先,我们从不同的数据源读取数据,并对数据进行转换和处理。然后,我们将处理后的结果写入到不同的数据源中。需要注意的是,写入到JDBC数据源时,需要指定JDBC连接信息和写入模式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值