Sil*_*ose 4 scala tuples limit dataframe apache-spark
我有66个要处理的DataFrame(几乎每个列值都需要更改)所以我正在运行以下语句
val result = data.map(row=> (
modify(row.getString(row.fieldIndex("XX"))),
(...)
)
)
Run Code Online (Sandbox Code Playgroud)
直到第66列.由于此版本中的scala限制为22对的最大元组,因此无法执行此操作.问题是,有什么解决方法吗?在所有行操作之后,我将其转换为具有特定列名称的df
result.toDf("c1",...,"c66")
result.storeAsTempTable("someFancyResult")
Run Code Online (Sandbox Code Playgroud)
"修改"功能只是一个展示我观点的例子
如果您所做的只是修改现有值,DataFrame
最好使用UDF而不是映射到RDD:
import org.apache.spark.sql.functions.udf
val modifyUdf = udf(modify)
data.withColumn("c1", modifyUdf($"c1"))
Run Code Online (Sandbox Code Playgroud)
如果由于某种原因上述不适合您的需求,您可以做的最简单的事情是DataFrame
从a 重新创建RDD[Row]
.例如像这样:
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.Row
import org.apache.spark.sql.types.{StructField, StructType, IntegerType}
val result: RDD[Row] = data.map(row => {
val buffer = ArrayBuffer.empty[Any]
// Add value to buffer
buffer.append(modify(row.getAs[String]("c1")))
// ... repeat for other values
// Build row
Row.fromSeq(buffer)
})
// Create schema
val schema = StructType(Seq(
StructField("c1", StringType, false),
// ...
StructField("c66", StringType, false)
))
sqlContext.createDataFrame(result, schema)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3083 次 |
最近记录: |