sql - 使用Scala从Spark hadoop中的字符串中提取单词

标签 sql regex scala apache-spark hadoop

我使用下面的代码来提取Spark SQL中需要的字符串。但是现在我正在Spark Hadoop中处理更多数据,我想提取字符串。我尝试了相同的代码,但是没有用。

val sparkConf = new SparkConf().setAppName("myapp").setMaster("local[*]")
val sc = new SparkContext(sparkConf)

val sqlContext = new org.apache.spark.sql.SQLContext(sc)
import sqlContext.implicits._
import org.apache.spark.sql.functions.{col, udf}
import java.util.regex.Pattern

//User Defined function to extract
def toExtract(str: String) = {      
  val pattern = Pattern.compile("@\\w+")
  val tmplst = scala.collection.mutable.ListBuffer.empty[String]
  val matcher = pattern.matcher(str)
  while (matcher.find()) {
    tmplst += matcher.group()
  }
  tmplst.mkString(",")
}

val Extract = udf(toExtract _)
val values = List("@always_nidhi @YouTube no i dnt understand bt i loved the music nd their dance awesome all the song of this mve is rocking")
val df = sc.parallelize(values).toDF("words")
df.select(Extract(col("words"))).show()

我该如何解决这个问题?

最佳答案

首先,您不是按其原意使用Spark。您的DataFrame完全没有分区。使用:val values = List("@always_nidhi", "@YouTube", "no", "i", "dnt", "understand" ...)。这样,每个单词的单词将分配给不同的分区,不同的JVM和/或群集(取决于分区的总数和数据大小)。在您的解决方案中,整个句子被分配到特定的分区,因此没有并行性或分布。

其次,您不必使用UDF(尽量避免使用UDF)。
为了找到您的正则表达式,您只需执行以下命令即可:dataFrame.filter(col("words") rlike "@\\w+")
希望能帮助到你 :-)

关于sql - 使用Scala从Spark hadoop中的字符串中提取单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56449994/

相关文章:

java - 使用java从txt文件插入oracle DB

python - 如何编写正则表达式来验证 DAY、MONTH dd、yyyy 类型的日期格式?

database - Lift 映射器中的外键约束

scala - Play 2.x : Reactive file upload with Iteratees

scala - 类 'SessionTrigger' 必须声明为抽象或实现抽象成员

Mysql 命令行语法错误

sql - NVL功能可以级联吗?

mysql - GROUP BY 一个键并选择另一个键上值最高的那个

html - 用于 HTML 标签之间文本的 Sublime Text RegEx 模式

python - 用于解析 python 中 float 列表的正则表达式