我将CSV加载为数据框。我想将所有列施放到浮动中,知道文件是大的写入所有列名称的大:
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")
给定此数据框架作为示例:
val df = sqlContext.createDataFrame(Seq(("0", 0),("1", 1),("2", 0))).toDF("id", "c0")
带有模式:
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))
请注意,也许这不是做到这一点的最佳解决方案,但可以是起点。