使用scala从URL中提取主机名

时间:2017-12-18 10:16:44

标签: scala

我从包含以下格式的源和目标网址的文件中提取了RDD:

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/

这些是源和目标网址。 我想只提取主机名,例如:

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

如果文件中只有一列使用

,我知道如何提取主机名
file.flatMap(_.split("/").take(1)). 

我不确定如何在源URL和目标网址上应用它。 这是我尝试过的:

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

请告诉我如何使用scala提取此格式。

谢谢!

3 个答案:

答案 0 :(得分:1)

假设输入源和目标网址以“\ 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(_))

答案 1 :(得分:0)

面向数据框的答案:

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)

使用udf函数,dunno如果这是优化的:

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

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

选择新栏目:

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

答案 2 :(得分:0)

您可以使用模式匹配:

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
  }
}