【问题标题】:Filter Column Text starting with > in Spark Scala DataFrame在 Spark Scala DataFrame 中过滤以 > 开头的列文本
【发布时间】:2019-02-26 18:38:22
【问题描述】:

我只需要过滤列中从 > 开始的文本。我知道有函数 startsWith & contains 可用于字符串,但我需要将它应用于 DataFrame 中的列。

 val dataSet = spark.read.option("header","true").option("inferschema","true").json(input).cace()
 dataSet.select(col = "_source.content").filter(_.startsWith(">"))

startsWith 不适用于数据集。

【问题讨论】:

  • 你用的是什么版本的 spark?
  • Spark 2.3.0 版和 Scala 2.11.12 版
  • Spark 支持 startWith 来检查列 values,至少从 v1.3 开始,您是否要过滤列名?
  • 我有一个 json 文件,它有很多列,一列“_source.content”有很多数据,我只想从该列获取 > 之后开始的数据。希望清除。我正在尝试过滤来自特定列的数据。

标签: scala parsing apache-spark apache-spark-sql bigdata


【解决方案1】:

是的,例如:

import org.apache.spark.sql.Column

val df = List(
  ("1001", "[physics, chemistry]", "pass"),
  ("1001", "[biology, math]", "fail"),
  ("3002", "[economics]", "pass"),
  ("2002", "[physics, chemistry]", "fail")
).toDF("student_id", "subjects", "result")

df.filter(col("student_id").startsWith("3")).show

返回:

+----------+-----------+------+
|student_id|   subjects|result|
+----------+-----------+------+
|      3002|[economics]|  pass|
+----------+-----------+------+

对于 JSON 派生输入 - 虽然不是真正相关,但使用 DF 而不是 DS 的示例(也适用于 DS),结构内的字段只有细微差别:

import org.apache.spark.sql.Column
val df = spark.read.json("/FileStore/tables/json_nested_4.txt")

import org.apache.spark.sql.functions._
val flattened = df.select($"name", explode($"schools").as("schools_flat"))

flattened.filter(col("name").startsWith("J")).show
flattened.filter(col("schools_flat.sname").startsWith("u")).show

基本输入和结构:

+-------+----------------+
|   name|    schools_flat|
+-------+----------------+
|Michael|[stanford, 2010]|
|Michael|[berkeley, 2012]|
|   Andy|    [ucsb, 2011]|
| Justin|[berkeley, 2014]|
+-------+----------------+

flattened: org.apache.spark.sql.DataFrame = [name: string, schools_flat: struct<sname: string, year: bigint>]

返回:

+------+----------------+
|  name|    schools_flat|
+------+----------------+
|Justin|[berkeley, 2014]|
+------+----------------+

+----+------------+
|name|schools_flat|
+----+------------+
|Andy|[ucsb, 2011]|
+----+------------+

【讨论】:

  • 我需要为此导入什么?
  • 不在 DataBricks 平台上,许多导入都是标准的。尝试导入 org.apache.spark.sql.Column。
  • 你运行的是什么版本?
  • 我在 textFile 上试过了,它成功了,spark 有 startsWith 方法,但在我的情况下,我使用的是 json 文件,它给了我错误。
  • val dataSet = spark.read.option("header","true").option("inferschema","true").json(input).cache() dataSet.filter(col ("_source.content").startsWith(">")).show(100,false)
【解决方案2】:

Spark没有“startsWith”功能,可以使用“substring”:

dataSet.select(col = "_source.content")
  .filter(substring($"_source.content",1,1)===">")

【讨论】:

  • Spark 也没有“子字符串”。
  • 可以,只需要导入“import org.apache.spark.sql.functions.substring”:spark.apache.org/docs/2.0.2/api/java/org/apache/spark/sql/…
  • 是的,当我导入它时出现错误,但我不这么认为它正在返回我想要的东西。我想要在 > 之后开始的文本。例如> 我要买这个。
  • 过滤后,函数“substring”可用于获取">"
  • 你的意思是你上面写的代码会给我想要的结果?
猜你喜欢
  • 1970-01-01
  • 2016-05-25
  • 2016-03-02
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多