sql修改字段名?
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當成一個參數序列來處理。