spark scala-读取各类数据源

原创 2018年04月17日 09:57:20

本文章主要通过scala实现spark读取各类数据源

1 读取hive数据

/**
 * @author jhp
  *         使用spark读取Hive数据
 */
object HiveDataSource {
  
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf()
        .setAppName("HiveDataSource");
    val sc = new SparkContext(conf);
    val hiveContext = new HiveContext(sc);
    
    hiveContext.sql("DROP TABLE IF EXISTS student_infos");
    hiveContext.sql("CREATE TABLE IF NOT EXISTS student_infos (name STRING, age INT)");
    hiveContext.sql("LOAD DATA "
        + "LOCAL INPATH '/usr/local/spark-study/resources/student_infos.txt' "
        + "INTO TABLE student_infos");
    
    hiveContext.sql("DROP TABLE IF EXISTS student_scores"); 
    hiveContext.sql("CREATE TABLE IF NOT EXISTS student_scores (name STRING, score INT)");  
    hiveContext.sql("LOAD DATA "
        + "LOCAL INPATH '/usr/local/spark-study/resources/student_scores.txt' "
        + "INTO TABLE student_scores");
    
    val goodStudentsDF = hiveContext.sql("SELECT si.name, si.age, ss.score "
        + "FROM student_infos si "
        + "JOIN student_scores ss ON si.name=ss.name "
        + "WHERE ss.score>=80");
    
    hiveContext.sql("DROP TABLE IF EXISTS good_student_infos");  
    goodStudentsDF.saveAsTable("good_student_infos");  
    
    val goodStudentRows = hiveContext.table("good_student_infos").collect();  
    for(goodStudentRow <- goodStudentRows) {
      println(goodStudentRow);  
    }
  }
  
}

2 读取json数据

import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.sql.SQLContext
import org.apache.spark.sql.types.StructType
import org.apache.spark.sql.types.StructField
import org.apache.spark.sql.types.StringType
import org.apache.spark.sql.types.IntegerType
import org.apache.spark.sql.Row
import org.apache.spark.sql.types.LongType


/**
 * @author jhp
  *         使用spark读取json文件
 */
object JSONDataSource {
  
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf()
        .setAppName("JSONDataSource")  
    val sc = new SparkContext(conf)
    val sqlContext = new SQLContext(sc)
    
    // 创建学生成绩DataFrame
    val studentScoresDF = sqlContext.read.json("hdfs://spark1:9000/spark-study/students.json")
    
    // 查询出分数大于80分的学生成绩信息,以及学生姓名
    studentScoresDF.registerTempTable("student_scores")
    val goodStudentScoresDF = sqlContext.sql("select name,score from student_scores where score>=80")
    val goodStudentNames = goodStudentScoresDF.rdd.map { row => row(0) }.collect()  
    
    // 创建学生基本信息DataFrame
    val studentInfoJSONs = Array("{\"name\":\"Leo\", \"age\":18}", 
        "{\"name\":\"Marry\", \"age\":17}",
        "{\"name\":\"Jack\", \"age\":19}")
    val studentInfoJSONsRDD = sc.parallelize(studentInfoJSONs, 3);
    val studentInfosDF = sqlContext.read.json(studentInfoJSONsRDD)  
    
    // 查询分数大于80分的学生的基本信息
    studentInfosDF.registerTempTable("student_infos")
    
    var sql = "select name,age from student_infos where name in ("
    for(i <- 0 until goodStudentNames.length) {
      sql += "'" + goodStudentNames(i) + "'"
      if(i < goodStudentNames.length - 1) {
        sql += ","
      }
    }
    sql += ")"  
    
    val goodStudentInfosDF = sqlContext.sql(sql)
    
    // 将分数大于80分的学生的成绩信息与基本信息进行join
    val goodStudentsRDD = 
        goodStudentScoresDF.rdd.map { row => (row.getAs[String]("name"), row.getAs[Long]("score")) }
            .join(goodStudentInfosDF.rdd.map { row => (row.getAs[String]("name"), row.getAs[Long]("age")) })  
  
    // rdd转换为dataframe
    val goodStudentRowsRDD = goodStudentsRDD.map(
        info => Row(info._1, info._2._1.toInt, info._2._2.toInt))  
            
    val structType = StructType(Array(
        StructField("name", StringType, true),
        StructField("score", IntegerType, true),
        StructField("age", IntegerType, true)))  
        
    val goodStudentsDF = sqlContext.createDataFrame(goodStudentRowsRDD, structType)  
    
    // dataframe中的数据保存到json    goodStudentsDF.write.format("json").save("hdfs://spark1:9000/spark-study/good-students-scala")  
  }
  
}

3 读取parquet数据

import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.sql.SQLContext
import org.apache.spark.sql.SaveMode

/**
 * @author jhp
  *         spark操作parquet格式数据
 */
object ParquetMergeSchema {
  
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf()
        .setAppName("ParquetMergeSchema")  
    val sc = new SparkContext(conf)
    val sqlContext = new SQLContext(sc)  
    
    import sqlContext.implicits._  
    
    // 创建一个DataFrame,作为学生的基本信息,并写入一个parquet文件中
    val studentsWithNameAge = Array(("leo", 23), ("jack", 25)).toSeq
    val studentsWithNameAgeDF = sc.parallelize(studentsWithNameAge, 2).toDF("name", "age")  
    studentsWithNameAgeDF.save("hdfs://spark1:9000/spark-study/students", "parquet", SaveMode.Append)
    
    // 创建第二个DataFrame,作为学生的成绩信息,并写入一个parquet文件中
    val studentsWithNameGrade = Array(("marry", "A"), ("tom", "B")).toSeq    
    val studentsWithNameGradeDF = sc.parallelize(studentsWithNameGrade, 2).toDF("name", "grade")  
    studentsWithNameGradeDF.save("hdfs://spark1:9000/spark-study/students", "parquet", SaveMode.Append)
  
    // 首先,第一个DataFrame和第二个DataFrame的元数据肯定是不一样的吧
    // 一个是包含了nameage两个列,一个是包含了namegrade两个列
    // 所以, 这里期望的是,读取出来的表数据,自动合并两个文件的元数据,出现三个列,nameagegrade
    
    // mergeSchema的方式,读取students表中的数据,进行元数据的合并
    val students = sqlContext.read.option("mergeSchema", "true")
        .parquet("hdfs://spark1:9000/spark-study/students")
    students.printSchema()
    students.show()  
  }
  
}

spark 压缩解压文件(基于scala)

def writerCompression(): Unit = { val fs = FileSystem.get(new Configuration()) val outFile =...
  • baidu_26981565
  • baidu_26981565
  • 2017-08-23 22:09:14
  • 577

Ubuntu下搭建Spark+Scala+idea-IC+R+Rstudio实践记录

一、基本命令 ls sudo -i 二、Ubuntu系统软件/插件安装 1、右键菜单“在终端中打开...” sudo apt-get install nautilus-open-terminal 2、...
  • aa3615058
  • aa3615058
  • 2015-01-22 00:14:42
  • 2805

Java 1.8+Hadoop 2.7.3+Spark 2.1.1+Scala 2.11.8整合分布式部署

在写本文章前,假设三个Linux系统已经装好,分别为: 三个主机: 键入命令: sudo vi /etc/hostname master、slave1、slave2 IP地址分别为: 修改文件host...
  • hsl_1990_08_15
  • hsl_1990_08_15
  • 2017-06-27 17:29:34
  • 639

spark 读取各类数据源

本文章主要通过代码实现spark读取各类数据源1 spark读取hive数据import org.apache.spark.SparkConf; import org.apache.spark.api...
  • qq_18603599
  • qq_18603599
  • 2018-04-15 18:56:10
  • 24

SparkSQL读取数据源

sparkSQL读取数据源
  • winner005
  • winner005
  • 2016-07-14 15:53:40
  • 1671

Spark在Windows下的环境搭建

由于Spark是用Scala来写的,所以Spark对Scala肯定是原生态支持的,因此这里以Scala为主来介绍Spark环境的搭建,主要包括四个步骤,分别是:JDK的安装,Scala的安装,Spar...
  • u011513853
  • u011513853
  • 2016-10-19 23:40:21
  • 54683

Spark 简单入门

#used for mycat cache service conf factory.encache=org.opencloudb.cache.impl.EnchachePooFactory #key...
  • fz2543122681
  • fz2543122681
  • 2016-08-19 15:57:58
  • 2944

spark SQL (五)数据源 Data Source----json hive jdbc等数据的的读取与加载

1,JSON数据集        Spark SQL可以自动推断JSON数据集的模式,并将其作为一个Dataset[Row]。这个转换可以SparkSession.read.json()在一个Da...
  • m0_37138008
  • m0_37138008
  • 2017-12-30 13:50:19
  • 167

spark SQL (四)数据源 Data Source----Parquet 文件的读取与加载

数据源 Data Source----Parquet 文件的读取与加载
  • m0_37138008
  • m0_37138008
  • 2017-12-30 12:59:00
  • 331

Spark编程环境搭建-超详细代码(可下载)

基于Intellij IDEA搭建Spark开发环境搭,、第一个Scala版本的spark程序和运行自己开发第一个Spark程序。...
  • dajiangtai007
  • dajiangtai007
  • 2016-12-28 16:18:25
  • 741
收藏助手
不良信息举报
您举报文章:spark scala-读取各类数据源
举报原因:
原因补充:

(最多只允许输入30个字)