1. 程式人生 > >舊版spark(1.6版本) 將rdd動態轉為dataframe

舊版spark(1.6版本) 將rdd動態轉為dataframe

前言

舊版本spark不能直接讀取csv轉為df,沒有spark.read.option(“header”, “true”).csv這麼簡單的方法直接將第一行作為df的列名,只能現將資料讀取為rdd,然後通過map和todf方法轉為df,如果csv的列數很多的話用如Array((1,2..))即Arrar(元組)建立的話很麻煩,本文解決如何用舊版spark讀取多列txt檔案轉為df

1、新版

為了直觀明白本文的目的,先看一下新版spark如何實現

1.1 資料

data.csv,如圖:

1.2 程式碼

新版程式碼較簡單,直接通過spark.read.option(“header”, “true”).csv(data_path)即可實現!

package com.dkl.leanring.spark.sql

import org.apache.spark.sql.SparkSession

object Txt2Df {
  def main(args: Array[String]): Unit = {
    val spark = SparkSession.builder().appName("Txt2Df").master("local").getOrCreate()
    val data_path = "files/data.csv"
    val df = spark.read.option("header"
, "true").csv(data_path) df.show() } }

1.3 結果

+----+----+----+----+----+
|col1|col2|col3|col4|col5|
+----+----+----+----+----+
|  11|  12|  13|  14|  15|
|  21|  22|  23|  24|  25|
|  31|  32|  33|  34|  35|
|  41|  42|  43|  44|  45|
+----+----+----+----+----+

2、舊版

2.1 資料

data.txt

col1,col2,col3,col4,col5
11,12,13,14,15
21,22,23,24,25
31,32,33,34,35
41,42,43,44,45

其中列數可任意指定

2.2 程式碼

package com.dkl.leanring.spark.sql

import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.sql.SQLContext
import org.apache.spark.sql.types._
import org.apache.spark.sql.Row
object Rdd2Df {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setAppName("Rdd2Df").setMaster("local")
    val sc = new SparkContext(conf)
    val sqlContext = new SQLContext(sc)
    import sqlContext.implicits._
    val data_path = "files/data.txt"
    val data = sc.textFile(data_path)
    val arr = data.collect()
    //arr1為除去第一行即列名的資料
    val arr1 = arr.slice(1, arr.length)
    val rdd = sc.parallelize(arr1)
    //列名
    val schema = StructType(arr(0).split(",").map(fieldName => StructField(fieldName, StringType, true)))
    val rowRDD = rdd.map(_.split(",")).map(p => Row(p: _*))
    sqlContext.createDataFrame(rowRDD, schema).show()

  }
}

2.3 結果

+----+----+----+----+----+
|col1|col2|col3|col4|col5|
+----+----+----+----+----+
|  11|  12|  13|  14|  15|
|  21|  22|  23|  24|  25|
|  31|  32|  33|  34|  35|
|  41|  42|  43|  44|  45|
+----+----+----+----+----+

根據結果看,符合逾期的效果!