Spark Scala 2.10元组限制

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)

"修改"功能只是一个展示我观点的例子

zer*_*323 6

如果您所做的只是修改现有值,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)