Извлекайте слова из строки в искривленном хадоопе со скалой - PullRequest
0 голосов
/ 04 июня 2019

Я использовал приведенный ниже код для извлечения необходимых мне строк в 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()

Как мне решить эту проблему?

1 Ответ

0 голосов
/ 05 июня 2019

Во-первых, вы используете Spark не так, как предполагалось.Ваш DataFrame вообще не разделен.Использование: val values = List("@always_nidhi", "@YouTube", "no", "i", "dnt", "understand" ...).Таким образом, каждая масса слов будет назначена отдельному разделу, разным JVM и / или кластерам (в зависимости от общего количества разделов и размера данных).В вашем решении все предложение назначено определенному разделу, и, следовательно, нет ни параллелизма, ни распределения.

Во-вторых, вам не нужно использовать UDF (старайтесь избегать их вообще).Чтобы найти свое регулярное выражение, вы можете просто выполнить: dataFrame.filter(col("words") rlike "@\\w+")

Надеюсь, это поможет: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...