我正在使用以下代码提取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()
如何解决此问题?
答案 0 :(得分:0)
首先,您使用的不是Spark的含义。您的DataFrame完全没有分区。采用:
val values = List("@always_nidhi", "@YouTube", "no", "i", "dnt", "understand" ...)
。这样,每个单词的单词将分配给不同的分区,不同的JVM和/或群集(取决于分区的总数和数据的大小)。在您的解决方案中,整个句子被分配到特定的分区,因此没有并行性或分布。
第二,您不必使用UDF(尽量避免使用UDF)。
为了找到您的正则表达式,您只需执行以下命令即可:
dataFrame.filter(col("words") rlike "@\\w+")
希望它会有所帮助:-)