Функция для преобразования буквы в слово - PullRequest
0 голосов
/ 13 июня 2019

Это мой текстовый файл, входящий в программу:

Id Title Copy 
B2002010 gyh 1 
D2001001 abc 12 
M2003005 zxc 3 
D2002003 qwe 13 
M2001002 efg 1 
D2001004 asd 6 
D2003005 zxc 3 
M2001006 wer 6 
D2001006 wer 6 
B2004008 sxc 10 
D2002007 sdf 9 
D2004008 sxc 10

ID отформатирован как Xyyyyrrr, где:

  • X - это B => Книга или M => Журнал
  • гггг это год
  • ррр - случайное число

Что мне нужно сделать, так это то, что первую букву нужно заменить на слово.

Например:

(D2002,24) --> Dictionary,2002,24

Мой проект Spark находится на Eclipse, и я использую Maven и Scala IDE l.

package bd.spark_app 
import org.apache.spark.SparkConf 
import org.apache.spark.SparkContext 
import org.apache.spark.SparkContext._ 
import org.apache.spark.sql.SQLContext 
import org.apache.spark.sql._ 
import org.apache.spark.sql.types.IntegerType 
import scala.io.Source 
import org.apache.spark.sql.functions._ 
import scala.collection.mutable.WrappedArray 
import org.apache.log4j._ 
import org.apache.spark.sql.types.{StructType, StructField, StringType} 
import org.apache.spark.sql.Row 
import scala.Array 

object alla { def main(args:Array[String]) = { 

    val conf  =newSparkConf().setMaster("local")
    .setAppName("trying   ") 
    val sc = new SparkContext(conf) 
    val x = 
    sc.textFile("/home/hadoopusr/sampledata") 

    val converted = x.map(_.split(" ")).map(r => 
    (r(0).dropRight(3), r(2).toInt)) val result = 
    converted.reduceByKey(_ + _)
    sc.stop() } } 

Результат

(M2001,7) (D2001,24) (M2003,3) (D2003,3) (D2002,22) (D2004,10) (B2002,1) (B2004,10)

Я бы хотел, чтобы результат был

(Magazine, 2001 ,7)
(Dictionary, 2001, 24)
(Magazine ,2003, 3)
(Dictionary, 2003, 3). 

и т. Д.

Простая функция поможет.

1 Ответ

2 голосов
/ 13 июня 2019

Может ли это помочь?

rdd.map(_.split(" "))
   .map(str => ((str.head.head match {
        case 'M' => "Magazine"
        case 'B' => "Book"
        case 'D' => "Dictionary"
        case _ => ???
      }, str.head.drop(1).dropRight(3).toInt), str.last.toInt))
   .reduceByKey(_ + _)
   .map(tuple => (tuple._1._1, tuple._1._2, tuple._2))

Пример вывода (проверено):

(Журнал, 2003,3), (Словарь, 2001,24), (Словарь, 2003,3), (Книга, 2002,1), (Журнал, 2001,7), (Книга, 2004,10), (Словарь, 2002,22), (Словарь, 2004,10)

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