大家好我加载了一个csv作为数据帧,我想把所有列都转换为float,知道该文件要大写所有列名
val spark = SparkSession.builder.master("local").appName("my-spark-app").getOrCreate()
val df = spark.read.option("header",true).option("inferSchema", "true").csv("C:/Users/mhattabi/Desktop/dataTest2.csv")
感谢任何帮助
答案 0 :(得分:7)
以此DataFrame为例:
val df = sqlContext.createDataFrame(Seq(("0", 0),("1", 1),("2", 0))).toDF("id", "c0")
with schema:
StructType(
StructField(id,StringType,true),
StructField(c0,IntegerType,false))
您可以通过 .columns 函数循环显示DF列:
val castedDF = df.columns.foldLeft(df)((current, c) => current.withColumn(c, col(c).cast("float")))
所以新的DF架构如下所示:
StructType(
StructField(id,FloatType,true),
StructField(c0,FloatType,false))
修改强>
如果您想从某些列中排除某些列,可以执行类似的操作(假设我们要排除列 id ):
val exclude = Array("id")
val someCastedDF = (df.columns.toBuffer --= exclude).foldLeft(df)((current, c) =>
current.withColumn(c, col(c).cast("float")))
其中exclude
是我们要从强制转换中排除的所有列的数组。
所以这个新DF的架构是:
StructType(
StructField(id,StringType,true),
StructField(c0,FloatType,false))
请注意,这可能不是最佳解决方案,但它可以作为一个起点。