我从包含以下格式的源和目标网址的文件中提取了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提取此格式。
谢谢!
答案 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
}
}