如何将所有数据帧列转换为字符串

时间:2017-02-07 02:36:19

标签: apache-spark pyspark apache-spark-sql

我有一个混合型数据框。 我正在使用hive表读取这个数据帧 spark.sql('select a,b,c from table')命令。

有些列是int,bigint,double,其他列是字符串。共有32列。 在pyspark中有什么办法可以将数据框中的所有列转换为字符串类型吗?

5 个答案:

答案 0 :(得分:16)

只需:

from pyspark.sql.functions import col

table = spark.sql("table")

table.select([col(c).cast("string") for c in table.columns])

答案 1 :(得分:3)

这是Scala中的单行解决方案:

df.select(df.columns.map(c => col(c).cast(StringType)) : _*)

让我们在这里查看示例:

import org.apache.spark.sql._
import org.apache.spark.sql.types._
import org.apache.spark.sql.functions._
val data = Seq(
   Row(1, "a"),
   Row(5, "z")
)

val schema = StructType(
  List(
    StructField("num", IntegerType, true),
    StructField("letter", StringType, true)
 )
)

val df = spark.createDataFrame(
  spark.sparkContext.parallelize(data),
  schema
)

df.printSchema
//root
//|-- num: integer (nullable = true)
//|-- letter: string (nullable = true)

val newDf = df.select(df.columns.map(c => col(c).cast(StringType)) : _*)

newDf.printSchema
//root
//|-- num: string (nullable = true)
//|-- letter: string (nullable = true)

我希望对您有帮助

答案 2 :(得分:1)

对于Scala,spark版本> 2.0

case class Row(id: Int, value: Double)

import spark.implicits._

import org.apache.spark.sql.functions._

val r1 = Seq(Row(1, 1.0), Row(2, 2.0), Row(3, 3.0)).toDF()

r1.show
+---+-----+
| id|value|
+---+-----+
|  1|  1.0|
|  2|  2.0|
|  3|  3.0|
+---+-----+

val castedDF = r1.columns.foldLeft(r1)((current, c) => current.withColumn(c, col(c).cast("String")))

castedDF.printSchema
root
 |-- id: string (nullable = false)
 |-- value: string (nullable = false)

答案 3 :(得分:0)

for col in df_data.columns:
     df_data = df_data.withColumn(col, df_data[col].cast(StringType()))

答案 4 :(得分:-1)

你可以像这样投射单列

import pyspark.sql.functions as F
import pyspark.sql.types as T
df = df.withColumn("id", F.col("new_id").cast(T.StringType()))

并且只为所有列进行转换