我有一个混合型数据框。
我正在使用hive表读取这个数据帧
spark.sql('select a,b,c from table')
命令。
有些列是int,bigint,double,其他列是字符串。共有32列。 在pyspark中有什么办法可以将数据框中的所有列转换为字符串类型吗?
答案 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()))
并且只为所有列进行转换