如何在 Scala 中向数组添加元素并查找变量类型?
Posted
技术标签:
【中文标题】如何在 Scala 中向数组添加元素并查找变量类型?【英文标题】:How to add elements to an array in Scala, and find variable type? 【发布时间】: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,则将这四个值相加,否则继续。
【参考方案1】:
-
使用 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
【讨论】:
谢谢,但就像我在问题中所说的那样,println(info.length)
正在打印一个非常大的数字,我认为这是所有字符串的总长度,而不是数组的实际长度。跨度>
在问题中,您 print(info) (给出类型和句柄) info.size 或 info.length 将为您提供数组/列表中的项目数
对不起,我现在更正了。 info.length
和 info.size
都给出了相同的答案,即 768,而我很确定我的数组的预期长度是
就是长度。您可以检查拆分之前得到的字符串(将其分成两行)并验证
对不起,我很困惑-info
不是拆分前的字符串吗?我尝试通过运行以下命令来使用.toArray.mkString(",")
,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 == "")) .toArray.mkString(",") println(info.length)
但结果甚至更高13158
以上是关于如何在 Scala 中向数组添加元素并查找变量类型?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 React native redux 的 reducer 中向数组添加元素?