【发布时间】:2018-12-16 21:06:00
【问题描述】:
我将以下 Scala 代码块作为我的数据处理管道的一部分。根据我目前的理解,UDF 接受一个参数file_contents,它的类型是String。然后 UDF 会进行一系列字符串处理,包括 split。
代码可以正常工作,但我试图以以下方式进行编辑并遇到困难,这主要是由于我对 Scala 缺乏经验,并且难以在网上找到答案。
- 根据
info的长度,我希望info能够有2 个空字符串和2 个零。如果info的长度为28,则将这四个值相加,否则继续。我怎样才能在下面的代码中做到这一点?我想在val param_data之前添加这段代码。
如果有人不介意回答,我还有关于此代码的以下问题。
- 如果
split将字符串转换为数组,为什么我不能使用println(info)打印它的长度?相反,这条线似乎打印了一个非常大的数字,我相信这是所有字符串的总长度。 -
你怎么知道这个 UDF 返回了什么?我没有看到像 Python 等中的
return语句。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]() } })
【问题讨论】:
-
你能澄清一下你想在代码中添加什么吗?
-
我希望能够根据
info的长度在info数组(如果它是一个数组)中添加2 个空字符串和2 个零。如果info的长度为28,则将这四个值相加,否则继续。
标签: scala apache-spark apache-spark-sql user-defined-functions