我需要修改dataframe的每一列的值,以便在映射后,它们都包含在双引号中,但dataframe仍然保留其原始结构和标题。
我尝试通过将行更改为序列来映射值,但它丢失了输出数据帧中的标头。
将此读入作为输入数据帧:
|prodid|name |city|
+------+-------+----+
|1 |Harshit|VNS |
|2 |Mohit |BLR |
|2 |Mohit |RAO |
|2 |Mohit |BTR |
|3 |Rohit |BOM |
|4 |Shobhit|KLK |我尝试了以下代码。
val columns = df.columns
df.map{ row =>
row.toSeq.map{col => "\""+col+"\"" }
}.toDF(columns:_*)但它会抛出一个错误,指出在映射的数据帧中只有一个头,即值。这是实际的结果(如果我去掉".df(columns:_*)"):
| value|
+--------------------+
|["1", "Harshit", ...|
|["2", "Mohit", "B...|
|["2", "Mohit", "R...|
|["2", "Mohit", "B...|
|["3", "Rohit", "B...|
|["4", "Shobhit", ...|
+--------------------+我的预期结果是:
|prodid|name |city |
+------+---------+------+
|"1" |"Harshit"|"VNS" |
|"2" |"Mohit" |"BLR" |
|"2" |"Mohit" |"RAO" |
|"2" |"Mohit" |"BTR" |
|"3" |"Rohit" |"BOM" |
|"4" |"Shobhit"|"KLK" |注意:本例中只有3个标头,但我的原始数据有很多标头,所以不能手动输入每个标头,以防文件标头发生变化。如何从中获得修改后的值dataframe?
编辑:如果我需要对除整数以外的所有值使用引号。因此,输出类似于:
|prodid|name |city |
+------+---------+------+
|1 |"Harshit"|"VNS" |
|2 |"Mohit" |"BLR" |
|2 |"Mohit" |"RAO" |
|2 |"Mohit" |"BTR" |
|3 |"Rohit" |"BOM" |
|4 |"Shobhit"|"KLK" |发布于 2019-04-15 03:10:18
使用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()输出:
+------+---------+-----+
|prodid| name| city|
+------+---------+-----+
| 1|"Harshit"|"VNS"|
| 2| "Mohit"|"BLR"|
+------+---------+-----+请注意,还有其他数字类型,如LongType和DoubleType,因此可能也需要处理这些类型,或者只引用StringType等。
https://stackoverflow.com/questions/55678830
复制相似问题