Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用scala从URL提取主机名_Scala - Fatal编程技术网

使用scala从URL提取主机名

使用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。 我只想提取主机

我从包含以下格式的源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                   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(_))