【发布时间】:2020-10-31 05:04:24
【问题描述】:
我有一个包含 100 列和 col 名称的数据框,例如 col1、col2、col3.... 我想根据条件匹配对列的值应用某些转换。我可以将列名存储在字符串数组中。并在 withColumn 中传递数组的每个元素的值,并根据何时条件,我可以垂直转换列的值。 但问题是,由于 Dataframe 是不可变的,因此每个更新的版本都需要存储在一个新变量中,并且新的 dataframe 还需要传入 withColumn 以进行下一次迭代的转换。 有什么方法可以创建数据帧数组,以便可以将新数据帧存储为数组元素,并且可以根据迭代器的值进行迭代。 或者有没有其他方法可以处理。
var arr_df : Array[DataFrame] = new Array[DataFrame](60)
--> 这会抛出错误“未找到类型 DataFrame”
val df(0) = df1.union(df2)
for(i <- 1 to 99){
val df(i) = df(i-1).withColumn(col(i), when(col(i)> 0, col(i) +
1).otherwise(col(i)))
这里 col(i) 是一个字符串数组,用于存储原始 datframe 的列名。
举个例子:
scala> val original_df = Seq((1,2,3,4),(2,3,4,5),(3,4,5,6),(4,5,6,7),(5,6,7,8),(6,7,8,9)).toDF("col1","col2","col3","col4")
original_df: org.apache.spark.sql.DataFrame = [col1: int, col2: int ... 2 more fields]
scala> original_df.show()
+----+----+----+----+
|col1|col2|col3|col4|
+----+----+----+----+
| 1| 2| 3| 4|
| 2| 3| 4| 5|
| 3| 4| 5| 6|
| 4| 5| 6| 7|
| 5| 6| 7| 8|
| 6| 7| 8| 9|
+----+----+----+----+
我想迭代3列:col1,col2,col3,如果该列的值大于3,那么它将更新+1
【问题讨论】:
-
嗨,欢迎来到 SO。作为社区标准,您能否发布示例输入、您尝试过的内容、预期输出以及您遇到的问题?
-
@Raghu,如果您想让我更具体一些,请告诉我。我不能分享确切的代码,但如果需要,我会尝试举个例子
-
是的,样本输入和预期输出会有所帮助。还可以尝试在编辑时使用格式选项 -{ 格式化您的代码。这提高了可读性
-
@Raghu ,希望这可以帮助您更具体地理解问题。
-
如果能添加样本数据就好了,什么样的转换和预期的输出..
标签: scala dataframe apache-spark apache-spark-sql