Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.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
Hadoop Spark-如何在HDFS中重新构造目录_Hadoop_Apache Spark_Hdfs - Fatal编程技术网

Hadoop Spark-如何在HDFS中重新构造目录

Hadoop Spark-如何在HDFS中重新构造目录,hadoop,apache-spark,hdfs,Hadoop,Apache Spark,Hdfs,我的目录结构如下: temp/Tweets/userId123/Tweets.csv temp/Tweets/userId456/Tweets.csv temp/Tweets/userId789/Tweets.csv temp/Mentions/userId123/Mentions.csv temp/Mentions/userId456/Mentions.csv temp/Mentions/userId789/Mentions.csv . . . 数据按数据实体的类型进行结构化,我想按用户

我的目录结构如下:

temp/Tweets/userId123/Tweets.csv
temp/Tweets/userId456/Tweets.csv
temp/Tweets/userId789/Tweets.csv

temp/Mentions/userId123/Mentions.csv
temp/Mentions/userId456/Mentions.csv
temp/Mentions/userId789/Mentions.csv

.
.
.
数据按数据实体的类型进行结构化,我想按用户对其进行重组,如下所示:

final/userId123/Tweets.csv
final/userId123/Mentions.csv
.
.

final/userId456/Tweets.csv
final/userId456/Mentions.csv
.
.

我一直在搜索google/StackOverflow/Spark文档,但还没有找到这样做的方法,但我认为应该有一种方法来修改目录结构。我如何做到这一点?

您可以使用Scala提供的
hadoop.fs.FileSystem
API(或者Python或Java—这里我将使用Scala):

import org.apache.hadoop.conf.Configuration
导入org.apache.hadoop.fs.{文件系统,路径}
首先,让我们定义一种列出userids hdfs文件夹的方法:

def listFolderNamesInFolder(hdfsPath:String):List[String]=
文件系统
.get(新配置())
.listStatus(新路径(hdfsPath))
.flatMap(status=>if(!status.isFile)Some(status.getPath.getName)else None)
托利斯先生
然后,让我们定义两个帮助程序来移动hdfs文件和创建hdfs文件夹:

def moveFile(oldPath:String,newPath:String):单位={
val fileSystem=fileSystem.get(新配置())
重命名(新路径(旧路径),新路径(新路径))
}
def createFolder(hdfsPath:String):单位=
FileSystem.get(新配置()).mkdirs(新路径(hdfsPath))
最后,让我们在每个userid文件夹上循环,并将每个Tweets、提及文件移动到关联的最终文件夹:

def moveTweetFiles(hdfsPath:String):单位=
listFolderNamesInFolder(s“$hdfsPath/temp/Tweets”).foreach{
case userid=>
createFolder(s“$hdfsPath/final/$userid”)
移动文件(
s“$hdfsPath/temp/Tweets/$userid/Tweets.csv”,
s“$hdfsPath/final/$userid/Tweets.csv”)
}
def MOVESINTOSFILES(hdfsPath:字符串):单位=
listFolderNamesInFolder(s“$hdfsPath/temp/intriends”).foreach{
case userid=>
createFolder(s“$hdfsPath/final/$userid”)
移动文件(
s“$hdfsPath/temp/INTENTES/$userid/INTENTES.csv”,
s“$hdfsPath/final/$userid/sinetions.csv”)
}
如果您的hdfs根文件夹(包含临时文件夹和最终文件夹的文件夹)是“src/test/resources”(我用来测试的):

moveTweetFiles(“src/test/resources”)
移动文件(“src/test/resources”)
顺便说一下:文件系统已经嵌入到Spark依赖项中(无需添加其他依赖项)

这可以作为Spark作业(Spark submit)启动,即使我们不使用任何Spark管道;或者可能只是从火花壳里