sql—使用scala从spark hadoop中的字符串中提取单词

laik7k3q  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(433)

我使用下面的代码来提取sparksql中需要的字符串。但是现在我正在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()

如何解决这个问题?

8oomwypt

8oomwypt1#

首先,你用的不是星火的本意。您的Dataframe根本没有分区。用途: val values = List("@always_nidhi", "@YouTube", "no", "i", "dnt", "understand" ...) . 这样,每一大块字都将被分配到不同的分区、不同的jvm和/或集群(取决于分区总数和数据大小)。在您的解决方案中,整个句子被分配到一个特定的分区,因此既没有并行性也没有分布性。
第二,你不必使用自定义项(一般情况下尽量避免使用)。为了找到正则表达式,您可以简单地执行: dataFrame.filter(col("words") rlike "@\\w+") 希望有帮助:-)

相关问题