sparkSql 创建dataFrame几种方式

前提
在老的版本1.x中,SparkSQL提供两种SQL查询起始点:一个叫SQLContext,用于Spark自己提供的SQL查询;一个叫HiveContext,用于连接Hive的查询。
SparkSession是Spark最新的2.x SQL查询起始点,实质上是SQLContext和HiveContext的组合,所以在SQLContext和HiveContext上可用的API在SparkSession上同样是可以使用的。SparkSession内部封装了sparkContext,所以计算实际上是由sparkContext完成的

创建dataFrame的几种方式

  1. 读json 文件:注意不能读取嵌套类型Json文件
  val spark = SparkSession.builder().appName("df1").getOrCreate()
  val df1: DataFrame = spark.read.json("./json")
  //俩种方式读json文件
 // val df1: DataFrame = spark.read.format("json").load("./json")
  df1.createTempView("t1")
  spark.sql("select * from t1 where age >21")
  1. 读parquet文件:和读json文件类似
 val spark = SparkSession.builder().appName("df1").getOrCreate()
  val df1: DataFrame = spark.read.parquet("./a")
  1. 读取mysql文件
 //sparkSql入口
  val spark = SparkSession.builder().master("local[*]").appName("df2").getOrCreate()
  val map = new util.HashMap[String, String]()
  //mysql 配饰四要素
  map.put("driver", "com.mysql.jdbc.Driver")
  map.put("url", "jdbc:mysql://hadoop-101:3306/spark")
  map.put("user", "root")
  map.put("password", "root")
  //指定表名
  map.put("dbtable", "person")
  
  //把表生成DataFrame
  val df1: DataFrame = spark.read.format("jdbc").options(map).load()

  //加载第二章表
  map.put("dbtable", "score")
  val df3: DataFrame = spark.read.format("jdbc").options(map).load()
  1. 通过反射方式将普通RDD转换为DataFrame 注意需要导入隐式转换
    a.txt内容如下
    1,zhangsan,20
    2,lisi,21
    3,wangwu,33
  //构建sparksql 入口
  val spark = SparkSession.builder().master("local").appName("RDD2Dataset").getOrCreate()
  //由spark创建sparkContext,创建普通Rdd
  val stuRDD = spark.sparkContext.textFile("./a.txt")
  //普通RDD转换为DataFrame需要隐式转换
   import spark.implicits._
   val df1: DataFrame = stuRDD.map(_.split(",")).map(parts ⇒ {
    val p = Person1(parts(0).trim.toInt, parts(1), parts(2).trim.toInt)
    p
  }).toDF()

  1. 通过动态创建schema的方式加载DataFrame
 //sparkSql入口spark
  val spark = SparkSession.builder().master("local[*]").appName("RDD2Dataset").getOrCreate()
  
  //普通Rdd的创建RDD[String]
  private val rdd1: RDD[String] = spark.sparkContext.textFile("./a")

  //先构建RDD[Row]
 val rowRdd: RDD[Row] = rdd1.map(_.split(",")).map(x => {
    RowFactory.create(Row(x(0).toInt, x(1)+"", x(2).toInt))

  })

  
   val list: util.List[StructField] = Arrays.asList(

    DataTypes.createStructField("id", DataTypes.IntegerType, true),
    DataTypes.createStructField("name", DataTypes.StringType, true),
    DataTypes.createStructField("age", DataTypes.IntegerType, true)

  )
  //创建schema
  val schema: StructType = DataTypes.createStructType(list)
  //由shema 和 rowRdd 创建DataFrame
  val df1: DataFrame = spark.createDataFrame(rowRdd,schema)
  1. 读Hive 中表数据, 前提配置了spark on hive
 val spark = SparkSession.builder().appName("RDD2Dataset").getOrCreate()
  val hiveContext = new HiveContext(spark.sparkContext)
  hiveContext.sql("drop table spark")
发布了53 篇原创文章 · 获赞 4 · 访问量 974

猜你喜欢

转载自blog.csdn.net/weixin_43548518/article/details/103437667
今日推荐