首頁>Club>
20
回覆列表
  • 1 # 大國師魂系列

    sprk sql修改欄位名有以下方法:1.dataframe預設的列名

    spark sql去讀取文字生成dataframe時,如果該文字沒有自帶schema資訊,預設的列名為_c0, _c1這種形式,我們可以看個例子。

    資料如下

    101 brand1

    101 brand2

    101 brand3

    102 brand1

    102 brand3

    102 brand3

    102 brand4

    103 brand2

    103 brand2

    103 brand2

    103 brand5

    103 brand5

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    如果我們讀取上述的csv文字然後生成dataframe, schema資訊如下

    @Test

    def parse2() = {

    val sparkConf = new SparkConf().setMaster("local[2]")

    sparkConf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")

    val spark = SparkSession.builder().config(sparkConf).getOrCreate()

    val path = "xxx"

    val df = spark.read

    .option("header", "false")

    .option("sep", "\t")

    .csv(path)

    df.printSchema()

    }

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    最後輸出為

    root

    |-- _c0: string (nullable = true)

    |-- _c1: string (nullable = true)

    1

    2

    3

    1

    2

    3

    文字預設兩列的列名即為_c0, _c1。

    2.用withColumnRenamed重新命名

    實際開發過程中,我們一般會給各列一個名字,這樣能方便我們後續開發。其中方法之一就可以使用withColumns方法。

    val df = spark.read

    .option("header", "false")

    .option("sep", "\t")

    .csv(path)

    .withColumnRenamed("_c0", "appid")

    .withColumnRenamed("_c1", "brand")

    df.printSchema()

    1

    2

    3

    4

    5

    6

    7

    8

    1

    2

    3

    4

    5

    6

    7

    8

    withColumns方法每次重新命名一列,當列比較多的時候,顯然不是特別方便,此時可以使用後面的方法。

    3.toDF方法

    val df1 = spark.read

    .option("header", "false")

    .option("sep", "\t")

    .csv(path)

    .toDF("appid", "brand")

    1

    2

    3

    4

    5

    1

    2

    3

    4

    5

    toDF後面直接跟列名,就可以達到重新命名的目的。

    toDF還有另外一種使用方法

    val names = Seq("appid", "brand")

    val df = spark.read

    .option("header", "false")

    .option("sep", "\t")

    .csv(path)

    .toDF(names: _*)

    df.printSchema()

    其中,_*作為一個整體,告訴編譯器你希望將某個引數當作引數序列處理。toDF的方法簽名為def toDF(colNames: String*),引數為可變長度的字串序列,剛好names: _*就可以將seq當成一個引數序列來處理。

  • 中秋節和大豐收的關聯?
  • 暗黑2六boss怎麼打?