如何读取和写入多个子文件夹?

rjjhvcjd  于 2021-06-01  发布在  Hadoop
关注(0)|答案(1)|浏览(241)

在/mypath/orc/path下,我有几个不同日期的子文件夹:ie

/mypath/orc/mydate=20170817/part1.orc
/mypath/orc/mydate=20170817/part2.orc
/mypath/orc/mydate=20170820/part1.orc
/mypath/orc/mydate=20170820/part2.orc
/mypath/orc/mydate=20170821/part1.orc
/mypath/orc/mydate=20170821/part2.orc

我想要的输出与此类似(文件的实际名称并不重要):

/mypath/parquet/mydate=20170817/part1and2together.parquet
/mypath/parquet/mydate=20170820/part1and2together.parquet
/mypath/parquet/mydate=20170821/part1and2together.parquet

我一直在尝试下面,我可以硬编码过滤器在每个日期,并呼吁这3次,但它会运行很长一段时间,如果我有1000个日期。我在代码中遗漏了什么让它一次处理多个日期输入到多个日期输出?

./spark-shell 
val orcfile = "hdfs:///mypath/orc/*/*.orc*"
val df = spark.read.format("orc").load(orcfile) 
df.createOrReplaceTempView("MYTBL") 
val results = spark.sql("SELECT * FROM MYTBL")
results.write.mode("Overwrite").format("parquet").save("hdfs:///mypath/parquet/")

环境:
独立模式下的spark 2.3.0
hadoop 2.8.3版
ec2集群-1个主机,64 cpu,256gb ram和5个工作线程(每个主机有64 cpu,256gb ram)
长时间是“几天到几周”,理想情况下希望它能在不到一天的时间内运行。

rks48beu

rks48beu1#

我猜分区人(“mydate”)阿拉:
http://javaagile.blogspot.com/2017/12/parquet-vs-avro-vs-orc.html
鉴于,因此:

spark.read
    .option("header", "true")
    .option("inferSchema", "true")
    .csv("IN_FILE").sort(partitionBy)
    .write.partitionBy("STREET").mode(SaveMode.Overwrite)
    .parquet("OUT_PARTITIONED")

生成如下目录结构:

$ hadoop fs -ls OUT_PARTITIONED.parquet | head
Found 69415 items
drwxrwxr-x   - user user          0 2017-11-23 09:16 OUT_PARTITIONED.parquet/STREET=%22%22%22Glück-auf%22%22-Straße%22
drwxrwxr-x   - user user          0 2017-11-23 09:16 OUT_PARTITIONED.parquet/STREET=%22Kellergasse %22%22Moorberg%22%22%22
drwxrwxr-x   - user user          0 2017-11-23 09:16 OUT_PARTITIONED.parquet/STREET=0Montangebiet
drwxrwxr-x   - user user          0 2017-11-23 09:16 OUT_PARTITIONED.parquet/STREET=0Tallage

在这个特殊的例子中,我有街道数据。注意,自从我在 STREET ,现在每条街道都有自己的目录。
当您想在分区内加入时,这会很方便,但请注意不要在hadoop namenode中创建太多条目。
如果你使用兽人,你会得到一个类似的区别,那就是:

相关问题