使用scala从URL提取主机名
我从包含以下格式的源URL和目标URL的文件中提取了RDD:使用scala从URL提取主机名,scala,Scala,我从包含以下格式的源URL和目标URL的文件中提取了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/ 这些是源URL和目标URL。 我只想提取主机
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/
这些是源URL和目标URL。
我只想提取主机名,例如:
google.de link.de
facebook.de facebook.de
community.cloudera.com community.cloudera.com
如果文件中只有一列,我知道如何使用
file.flatMap(_.split("/").take(1)).
我不知道如何在源URL和目标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提取此格式
谢谢 面向数据帧的答案:
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函数,不知道这是否已优化:
val get_domain = spark.udf.register("get_domain",(value:String)=> value.takeWhile(_ != '/'))
或
并选择新列:
val df_final = df_raw
.withColumn("src_domain",get_domain(col("src")))
.withColumn("dst_domain",get_domain(col("dst")))
您可以使用模式匹配:
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
}
}
假设输入源URL和目标URL用“\t”分隔
val result=file.map(f=>{
val url=f.split(“\t”)
如果(!(url.length<2)){
val result=URL(0).takeWhile(!='/')+“\t”+URL(1).takeWhile(!='/'))
结果
}否则
无效的
})
result.collect()
Hi。谢谢你的回复。我有.gz文件。当我尝试读取它时,val df_raw=spark.read.format(“com.databricks.spark.csv”).option(“delimiter”和“\t”).option(“header”,“true”).load(“filename.gz”)我得到一个错误名称:编译错误消息::1:错误:定义的非法开始。格式(“com.databricks.spark.csv”)。对于我的用例,我会创建一个shell文件来将文件解压到一个目录中并从这里读取它们。但我想你应该使用RDD API。祝你好运。你希望输出是什么样子的。?你希望源URL和目标URL都是一条记录,由一些分隔符分隔。还是希望所有内容都被展平以只给出一个分隔符主机名?谢谢你的回复。我只需要从源URL和目标URL中提取主机名,并用一些分隔符分隔,我的输出应该与我在问题中指定的一样。嗨,谢谢你的回答。我尝试了这个。但我没有检索任何结果。从输入文件创建rdd的代码是什么?它的val文件=sc.textFile(“filename.gz”),所以当您执行“val lines=srcAndDest.collect;println(行长度);lines.foreach(println)“-控制台中未打印任何内容?不幸的是,控制台中未打印任何内容。Hi不将其保存为字符串,而是可以将其映射为格式(a,b)?因为我需要计算inlinks和pagerank。通过映射,你是指一对rdd吗?如果是,你可以创建一对rdd,只需返回一个带有键值对的scala元组,如下所示。val result=file.map(f=>{val url=f.split(“\t”)If(!(url.length<2)){(URL(0)。takeWhile(!='/'),URL(1)。takeWhile(!='/')}else(null,null)})是的,我试过了,也可以查看记录。但是,当我尝试将它保存到.gz格式的文件中时,出现了一些错误。嗨,我把它整理好了。谢谢你的帮助:)
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
}
}
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(_))