2 votes

Extraire le nom de l'hôte à partir de l'URL en utilisant scala

J'ai un RDD extrait de fichiers contenant des URLs source et destination du format :

google.de/2011/10/Extract-host       link.de/2011/10/extact-host
facebook.de/2014/11/photos           facebook.de/2014/11/name.jpg
community.cloudera.com/t5/           community.cloudera.com/t10/

Ce sont les URL source et destination. Je voudrais extraire uniquement le nom de l'hôte, par exemple :

google.de                   link.de
facebook.de                 facebook.de
community.cloudera.com      community.cloudera.com

Je sais comment extraire le nom d'hôte s'il n'y a qu'une seule colonne dans le fichier en utilisant

file.flatMap(_.split("/").take(1)). 

Je ne sais pas comment l'appliquer à la fois aux URL source et destination. Voici ce que j'ai essayé :

file.flatMap{case(src + "\t" +  dst) => 
((split.take(1).flatMap(line => line.split("/").take(1))),
(split.takeRight(1).flatMap(line => line.split("/").take(1))))}

Veuillez me dire comment extraire ce format en utilisant Scala.

Merci !

1voto

Amit Kumar Points 1112

En supposant que les urls de source et de destination sont séparées par des ". \t "

val result = file.map(f => {
      val urls = f.split("\t")
      if (!(urls.length < 2)) {
        val result = urls(0).takeWhile(_ != '/') + "\t" + urls(1).takeWhile(_ != '/')
        result
      } else
        null
    })

    result.collect().foreach(println(_))

0voto

tricky Points 561

Une réponse orientée cadre de données :

val df_raw = spark.read
    .format("com.databricks.spark.csv")
    .option("delimiter","\t")
    .option("header", "true")
    .load("your_file.txt")

//if header is false just specify a schema
import org.apache.spark.sql.types._

val schema = StructType(
  StructField("src", StringType, true) :: 
  StructField("dst", StringType, true) :: Nil)

//and add this line to the spark.read :
//.schema(schema)

Utilisation d'une fonction udf, je ne sais pas si c'est optimisé :

val get_domain = spark.udf.register("get_domain",(value:String)=> value.takeWhile(_ != '/'))

ou

val get_domain = udf((value:String)=> value.takeWhile(_ != '/'))

Et en sélectionnant les nouvelles colonnes :

val df_final = df_raw
    .withColumn("src_domain",get_domain(col("src")))
    .withColumn("dst_domain",get_domain(col("dst")))

0voto

igorpcholkin Points 534

Vous pouvez utiliser le filtrage par motif :

val pattern = """([a-zA-Z0-9\.]+)/\S*\s+([a-zA-Z0-9\.]+)/.*""".r

val srcAndDest = rdd flatMap {
  _ match {
    case pattern(src, dest) => Some(src, dest)
    case _                  => None
  }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X