【发布时间】:2018-12-01 05:53:34
【问题描述】:
我已经通过 stackoverflow 搜索了几天,但我只是没有找到以下问题的答案。我对 scala 编码真的很陌生,所以这可能是一个非常基本的问题。任何帮助将不胜感激。
我遇到的问题(出现错误)与最后一段代码有关。
我正在尝试从数据框中获取过滤后的记录子集,其中所有过滤后的记录都缺少一个或多个指定字段中的数据。
我在 Eclipse 中使用 Scala IDE Build 4.7.0。
我使用的 pom.xml 文件有 spark-core_2.11,版本 2.0.0
谢谢。
杰西
val source_path = args(0)
val source_file = args(1)
val vFile = sc.textFile(source_path + "/" + source_file)
val vSchema = StructType(
StructField("FIELD_1",LongType,false)::
StructField("FIELD_2",LongType,false)::
StructField("FIELD_3",StringType,true)::
StructField("FIELD_4",StringType,false)::
StructField("FIELD_ADD_1",StringType,false)::
StructField("FIELD_ADD_2",StringType,false)::
StructField("FIELD_ADD_3",StringType,false)::
StructField("FIELD_ADD_4",StringType,false)::
StructField("FIELD_5",StringType,false)::
StructField("FIELD_6",StringType,false)::
StructField("FIELD_7",StringType,false)::
StructField("FIELD_8",StringType,false)::
Nil)
// val vRow = vFile.map(x=>x.split((char)30, -1)).map(x=> Row(
val vRow = vFile.map(x=>x.split("", -1)).map(x=> Row(
x(1).toLong,
x(2).toLong,
x(3).toString.trim(),
x(4).toString.trim(),
x(5).toString.trim(),
x(6).toString.trim(),
x(7).toString.trim(),
x(8).toString.trim(),
x(9).toString.trim(),
x(10).toString.trim(),
x(11).toString.trim(),
x(12).toString.trim()
))
val dfData = sqlContext.createDataFrame(vRow.distinct(),vSchema)
val dfBlankRecords = dfData.filter(x => (
x.trim(col("FIELD_ADD_1")) == "" ||
x.trim(col("FIELD_ADD_2")) == "" ||
x.trim(col("FIELD_ADD_3")) == "" ||
x.trim(col("FIELD_ADD_4")) == ""
))
【问题讨论】:
-
我会添加
apache-spark标签以获得更好的可见性。在val vRow ...行中,您正在执行x.split("", -1)。那里的空字符串是故意的吗?分割成单个字符的数组。 -
另外,什么版本的火花?如果
>= 1.6有更好的方法将reading text files 直接导入数据集。 -
@TravisHegner,这些引号之间实际上有一个未打印的字符,作为文件中的列分隔符存在。我打算尝试使用以下行,以便更清晰一些,但我还没有弄清楚如何正确编写它。 val vSrcRow = vSrcFile.map(x=>x.split((char)30, -1)).map(x=> Row( 另外,根据我与 .scala 一起使用的 pom.xml 文件代码文件,我有 spark-core_2.11,版本 2.0.0。如果您愿意分享,我会很高兴看到将文本文件读入数据集的更好方法。
标签: eclipse scala dataframe filter