Spark实战(九)sparkRDD转为DataFrame的两种方式

5 篇文章 0 订阅

一、使用反射的方式

   这种方式是使用反射的方式,用反射去推倒出来RDD里面的schema,也就是根据包括case class数据的RDD转换成DataFrame,这个方式简单,在已知schema的时候非常方便

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

val spark = SparkSession.builder().appName("TopNStatJob")
  .config("spark.sql.sources.partitionColumnTypeInference.enabled","false")
  .master("local[2]").getOrCreate()

//    val accessRdd = spark.sparkContext.textFile("D://item//mukewang//data//1.txt")
    val accessRdd = transfer(spark,"D://item//mukewang//data//province.txt")

inferReflection(accessRdd,spark)

 }
	def inferReflection(rdd :RDD[String],spark:SparkSession): Unit = {

//    val  rdd1 = rdd.map(line =>{
//      val splits = line.split("\t")
//
//    })
    //注意:需要导入隐式转换
    import spark.implicits._
    val rddDF = rdd.map(_.split("\t")).map(line => region(line(0),line(1))).toDF()
    rddDF.show()

  }
 case class region(code: String, name: String)

二、使用编程方式动态转

   首先构建一个RDD,再创建由一个 StructType 表示的模式,构造schema用到了两个类StructType和StructFile,然后通过 createDataFrame 方法应用模式

def program(rdd :RDD[String],spark:SparkSession):Unit={

//    rdd.take(10).foreach(println)
    val rddDF = rdd.map(_.split("\t")).map(line => Row(line(0),line(1)))
    val structType = StructType(Array(StructField("code",StringType,true),
      StructField("name",StringType,true)
    ))

    val infoDF = spark.createDataFrame(rddDF,structType)
    infoDF.printSchema()
    infoDF.show()
  }

三、txt文件中文乱码

   下面是一个读取txt文件中文乱码的解决方法:

def transfer(sc:SparkSession,path:String):RDD[String]={
    sc.sparkContext.hadoopFile(path,classOf[TextInputFormat],classOf[LongWritable],classOf[Text],1)
      .map(p => new String(p._2.getBytes, 0, p._2.getLength, "GBK"))
  }

   在使用时直接调用即可:

 val accessRdd = transfer(spark,"D://item//mukewang//data//province.txt")
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值