云栖问答

找不到答案?去提问题

数据处理 spark scala string UDF type list 数组 2018-12-19 15:44:27

如何在Scala中向数组添加元素,并找到变量类型?

如何在Scala中向数组添加元素,并找到变量类型?
我有下面的Scala代码块作为我的数据处理管道的一部分。形成我目前所理解的,UDF接受一个file_contents类型String类型的参数。然后UDF进行一堆字符串处理,包括a split。

代码工作没有任何错误,但我正在尝试以下面的方式编辑和挣扎,主要是由于我对Scala的经验不足,以及在线寻找答案的困难。

我希望能够info根据长度为2个空字符串和2个零info。如果长度info为28,则添加这四个值,否则继续。我如何在下面的代码中完成此操作?我想先添加此代码val param_data。
如果有人不介意回答,我对此代码也有以下问题。

如果split将字符串转换为数组,为什么我无法使用它打印它的长度println(info)?这条线似乎打印了一个非常大的数字,我相信这是所有字符串的总长度。
你怎么知道这个UDF返回了什么?我没有看到return像Python等的声明。

def extract_FileContent_test = udf((file_contents: String) => {

val info = (file_contents.replace("","", " ")

.replace("\"", "")
.replaceAll("    ", "|")
.replaceAll(" : \r\n", " : empty\r\n")
.replaceAll("\r\n", "|")
.replaceAll(" : ", "|")
.replaceAll(": ", "|")
.split("\\|")
.map(x => x.trim.replaceAll(" -", ""))
.filterNot(s => s == ""))

println(info.length)
// type info : Array[String]

// type sec_index : Array[Int]
val sec_index = info.zipWithIndex.filter(_._1.startsWith("---")).map(_._2)

if (sec_index.length > 2) {

// parse meta_data (beam tuning context) and param_data (beam tuning parameter) separately

val meta_data = (info.slice(0, sec_index(0)).toList.grouped(2)

.filter(l => l.length == 2)
.filter(l => l(1) != "Start" & l(1) != "")
.map { case List(a, b) => b }
.toArray.mkString(",")
)

// println(meta_data)

val param_data = (info.slice(sec_index(0) + 1, sec_index(1)).toList.grouped(3)

.filter(l => l.length == 3)
.filter { case List(a, b, c) => Try(c.split(" ")(0).toDouble).isSuccess }
.map { case List(a, b, c) => Array(a, c.split(" ")(0)).mkString(",") }
.toArray)

// println(param_data)

/* one meta data will have > 100 param
so besides meta columns, we add 2 columns for param_name, param_value
*/
param_data.map(meta_data + "," + _)
}
else {
Array[String]()
}
})

1个回答

0

社区小助手

获取信息的长度使用info.length
在Scala中,最后一个语句是返回值 - 这里是 if (sec_index.length > 2)它返回一个空数组的字符串或者返回最后一个映射后的params_data
关于向信息添加数据,您可以执行类似的操作

val info_with_filler = if ( info.length<28) info ++ List("","" ,"0","0") else info
然后在代码中使用info_with_filler而不是info

1
GO