转换数据框的每个值

Sid*_*ler 1 mapping scala dataframe apache-spark rdd

我需要修改数据框的每一列的值,以便在映射后将它们全部括在双引号中,但数据框仍保留其带有标题的原始结构。

我尝试通过将行更改为序列来映射值,但它在输出数据帧中丢失了其标头。

将其作为输入数据框读入:

|prodid|name   |city|
+------+-------+----+
|1     |Harshit|VNS |
|2     |Mohit  |BLR |
|2     |Mohit  |RAO |
|2     |Mohit  |BTR |
|3     |Rohit  |BOM |
|4     |Shobhit|KLK |
Run Code Online (Sandbox Code Playgroud)

我尝试了以下代码。

val columns = df.columns
df.map{ row => 
           row.toSeq.map{col => "\""+col+"\"" }
    }.toDF(columns:_*)
Run Code Online (Sandbox Code Playgroud)

但是它抛出错误,指出映射的数据帧中只有1个标头,即值。这是实际结果(如果我删除了“ .df(columns:_ *)”):

|               value|
+--------------------+
|["1", "Harshit", ...|
|["2", "Mohit", "B...|
|["2", "Mohit", "R...|
|["2", "Mohit", "B...|
|["3", "Rohit", "B...|
|["4", "Shobhit", ...|
+--------------------+
Run Code Online (Sandbox Code Playgroud)

我的预期结果是:

|prodid|name     |city  |
+------+---------+------+
|"1"   |"Harshit"|"VNS" |
|"2"   |"Mohit"  |"BLR" |
|"2"   |"Mohit"  |"RAO" |
|"2"   |"Mohit"  |"BTR" |
|"3"   |"Rohit"  |"BOM" |
|"4"   |"Shobhit"|"KLK" |
Run Code Online (Sandbox Code Playgroud)

注意:此示例中只有3个标头,但是我的原始数据有很多标头,因此,如果文件标头发生更改,则不能手动键入每个标头。我如何从中获得这个修改后的值数据框?

编辑:如果我需要除整数以外的所有值都加引号。因此,输出类似于:

|prodid|name     |city  |
+------+---------+------+
|1     |"Harshit"|"VNS" |
|2     |"Mohit"  |"BLR" |
|2     |"Mohit"  |"RAO" |
|2     |"Mohit"  |"BTR" |
|3     |"Rohit"  |"BOM" |
|4     |"Shobhit"|"KLK" |
Run Code Online (Sandbox Code Playgroud)

oll*_*ik1 5

使用select可能会更容易:

val df = Seq((1, "Harshit", "VNS"), (2, "Mohit", "BLR"))
  .toDF("prodid", "name", "city")

df.select(df.schema.fields.map {
  case StructField(name, IntegerType, _, _) => col(name)
  case StructField(name, _, _, _) => format_string("\"%s\"", col(name)) as name
}:_*).show()
Run Code Online (Sandbox Code Playgroud)

输出:

+------+---------+-----+
|prodid|     name| city|
+------+---------+-----+
|     1|"Harshit"|"VNS"|
|     2|  "Mohit"|"BLR"|
+------+---------+-----+
Run Code Online (Sandbox Code Playgroud)

请注意,还有其他数字类型,例如LongType和,DoubleType因此可能也需要处理这些数字类型,或者仅引用StringType等。