SparkSQL把rdd转化为DataFrame时,想要把整个数组的值都放到Row中则么办?

在使用sparkSQL,有时想要把rdd中的数据转换成DataFrame,RDD中的的数据可能时Array类型,或者是想要把数组类型中的所有元素放到Row中,当数组中的元素特别多时,可能就会变得更加麻烦,其实Row的Object中为我们提供了一个很好的方法,就是merge方法,话不多说,直接看代码吧
在这里插入图片描述

Object  Demo {
   
def main(args: Array[String]): Unit = {
   
    val conf = new SparkConf().setAppName(s"${this.getClass.getName}").setMaster("local")
    val sc = new SparkContext(conf)
    val sqlContext = new SQLContext(sc)
    //这里我是并行化创建了一个RDD,当然也可从文件读取
    val lines:RDD[String] = sc.parallelize(Array("a 1 c","n 2 m"))
    //把每一行数据都按空格进行切分后,得到的RDD中的是Array数组
   val splits: RDD[Array[String]]  = lines.map(_.split(" "))
   //现在想要把splits转换成RDD[Row]类型,以进行转换为DataFrame
    val rowRDD: RDD[Row] = .map(t => {
   
      var row: Row = Row() //先创建一个Row,空的
      for (i <- 0 until (t.size)) {
   
      //每次把这次的Row类型,和原来的Row进行合并, 最后的row中有是
      //数组里面的所有字段
      //把第2个值 转成 int类型 在添加到Row中
        if(i==1)row = Row.merge(row,Row(t(i).toInt))
        
        else row = Row.merge(row,Row(t(i)))
      }
      //最后把row 返回,此时的row中相当于Row(t(0),t(1).toInt,t(2))
      //在数字段数特别多时,就会特别麻烦,可以使用上面的那种方法
      row
    })
    //最后在创建元数据
    val structType = StructType(List(StructField("name",StringType,true),StructField("name1",IntegerType,true),StructField("name2",StringType,true)))
    val df1 = sqlContext.createDataFrame(rowRDD,structType)
    df1.show()
    sc.stop()

  }
}

上面的列子字段比较少,可能不是特别明显,可以通过下面的列子在进行比较

object Bz2toParquet01 {
   
  def main(args: Array[String]): Unit = {
   
    val conf = new SparkConf().setAppName(s"${this.getClass.getName}").setMaster("local").set("spark.serializer","org.apache.spark.serializer.KryoSerializer")
    val sc = new 
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值