Scala-在多个字段上使用DF过滤器

时间:2018-06-21 19:36:13

标签: eclipse scala dataframe filter

我已经在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")) == ""
                ))

1 个答案:

答案 0 :(得分:0)

firstName lastName Terry Pratchett Neil Gaiman 函数将数据直接读入Dataset / Dataframe API,从而避免了(某种程度上)对模式定义的需求,并且完全使用了RDD API。

spark.read.*

我认为这将带来您想要的。我敢肯定,比我自己更好的人可以通过更简洁的代码来进行更多优化。

请注意,数组是零索引的,如果您有意选择特定字段,则必须对其进行调整。我也不确定val source_path = args(0) val source_file = args(1) val dfData = spark.read.textFile(source_path + "/" + source_file) .flatMap(l => { val a = l.split('\u001e'.toString, -1).map(_.trim()) val f1 = a(0).toLong val f2 = a(1).toLong val Array(f3, f4, fa1, fa2, fa3, fa4, f5, f6, f7, f8) = a.slice(2,12) if (fa1 == "" || fa2 == "" || fa3 == "" || fa4 == "") { Some(f1, f2, f3, f4, fa1, fa2, fa3, fa4, f5, f6, f7, f8) } else { None } }).toDF("FIELD_1", "FIELD_2", "FIELD_3", "FIELD_4", "FIELD_ADD_1", "FIELD_ADD_2", "FIELD_ADD_3", "FIELD_ADD_4", "FIELD_5", "FIELD_6", "FIELD_7", "FIELD_8") (十六进制值30)是否适合拆分字符串所需的值。