olarak değişiyor UD'ye kıvılcımdaki bir yapıyı aktarmaya çalışıyorum. Alan adlarını değiştiriyor ve sütun pozisyonuna yeniden ad veriyor. Nasıl düzeltebilirim?Spark Yapı yapısal adları UDF
object TestCSV {
def main(args: Array[String]) {
val conf = new SparkConf().setAppName("localTest").setMaster("local")
val sc = new SparkContext(conf)
val sqlContext = new SQLContext(sc)
val inputData = sqlContext.read.format("com.databricks.spark.csv")
.option("delimiter","|")
.option("header", "true")
.load("test.csv")
inputData.printSchema()
inputData.show()
val groupedData = inputData.withColumn("name",struct(inputData("firstname"),inputData("lastname")))
val udfApply = groupedData.withColumn("newName",processName(groupedData("name")))
udfApply.show()
}
def processName = udf((input:Row) =>{
println(input)
println(input.schema)
Map("firstName" -> input.getAs[String]("firstname"), "lastName" -> input.getAs[String]("lastname"))
})
}
Çıktı:
root
|-- id: string (nullable = true)
|-- firstname: string (nullable = true)
|-- lastname: string (nullable = true)
+---+---------+--------+
| id|firstname|lastname|
+---+---------+--------+
| 1| jack| reacher|
| 2| john| Doe|
+---+---------+--------+
Hata:
[jack,reacher] StructType(StructField(i[1],StringType,true), > StructField(i[2],StringType,true)) 17/03/08 09:45:35 ERROR Executor: Exception in task 0.0 in stage 2.0 (TID 2) java.lang.IllegalArgumentException: Field "firstname" does not exist.
Neden iki dizeyi ("Dizeler" gibi) doğrudan udf'ye aktarmıyorsunuz? –
Bu mümkündür, ancak Spark UDF'de 10'dan fazla alanı argüman olarak geçemezsiniz. Burada verdiğim, basitleştirilmiş bir kullanım vakası. Bazen UDF'de 20'den fazla sütun geçirmem gerekiyor. Bunu nasıl başarabilirim? – hp2326