Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.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 如何使用数据上的某个键将HDFS文件拆分为多个目录_Hadoop_Apache Pig_Hdfs - Fatal编程技术网

Hadoop 如何使用数据上的某个键将HDFS文件拆分为多个目录

Hadoop 如何使用数据上的某个键将HDFS文件拆分为多个目录,hadoop,apache-pig,hdfs,Hadoop,Apache Pig,Hdfs,我有一个包含以下示例数据的HDFS文件 id名称时间戳1 Lorem 2013-01-012 Ipsum 2013-02-01 3 Ipsum 2013-03-01 现在我想以/data/YYYY/MM/DD格式将数据拆分到多个目录中,例如记录1转到目录/data/2016/01/01 pig中有多个存储UDF,可以按年份、月份或日期拆分为单个目录。有什么方法可以把我分成多个目录吗 能否在时间戳列上创建一个蜂窝分区表,并使用HCatStorer仅将数据存储在pig中 通过这种方式,您可能无法获得

我有一个包含以下示例数据的HDFS文件

id名称时间戳
1 Lorem 2013-01-01
2 Ipsum 2013-02-01
3 Ipsum 2013-03-01

现在我想以
/data/YYYY/MM/DD
格式将数据拆分到多个目录中,例如记录1转到目录
/data/2016/01/01


pig中有多个存储UDF,可以按年份、月份或日期拆分为单个目录。有什么方法可以把我分成多个目录吗

能否在时间戳列上创建一个蜂窝分区表,并使用HCatStorer仅将数据存储在pig中


通过这种方式,您可能无法获得您选择的目录,但您可以按照您的要求在多个目录中获取数据。

您可以在时间戳列上创建一个蜂窝分区表,并使用HCatStorer仅在pig中存储数据


通过这种方式,您可能无法获得您选择的目录,但您可以根据需要在多个目录中获取数据。

您可以从以下三种方法中进行选择:

  • 您可以编写shell脚本来执行此任务
  • 您可以使用分区er类编写mapreduce作业
  • 您可以创建配置单元分区表并按年、月和日应用分区,但目录名称中的前缀将是
    分区列名=
    /data/year=2016/month=01/date=07
  • 让我知道你更喜欢哪种方法,我会用一个基于此的例子更新答案

    使用shell脚本更新解决方案:

    给定hdfs中具有相同内容的两个输入/源文件:

    [cloudera@quickstart ~]$ hadoop fs -ls /user/cloudera/test_dir
    Found 2 items
    -rw-r--r--   1 cloudera cloudera         79 2016-08-02 04:43 /user/cloudera/test_dir/test.file1
    -rw-r--r--   1 cloudera cloudera         79 2016-08-02 04:43 /user/cloudera/test_dir/test.file2
    
    Shell脚本:


    您可以从以下三种方法中进行选择:

  • 您可以编写shell脚本来执行此任务
  • 您可以使用分区er类编写mapreduce作业
  • 您可以创建配置单元分区表并按年、月和日应用分区,但目录名称中的前缀将是
    分区列名=
    /data/year=2016/month=01/date=07
  • 让我知道你更喜欢哪种方法,我会用一个基于此的例子更新答案

    使用shell脚本更新解决方案:

    给定hdfs中具有相同内容的两个输入/源文件:

    [cloudera@quickstart ~]$ hadoop fs -ls /user/cloudera/test_dir
    Found 2 items
    -rw-r--r--   1 cloudera cloudera         79 2016-08-02 04:43 /user/cloudera/test_dir/test.file1
    -rw-r--r--   1 cloudera cloudera         79 2016-08-02 04:43 /user/cloudera/test_dir/test.file2
    
    Shell脚本:


    谢谢配置单元文件格式看起来不错使用配置单元分区表的唯一问题是它将以ORC文件格式存储文件,我想使用文本格式。你也可以告诉我什么是外壳脚本,将为我做的工作。谢谢。配置单元文件格式看起来不错使用配置单元分区表的唯一问题是它将以ORC文件格式存储文件,我想使用文本格式。你也可以告诉我什么是shell脚本,将为我做的工作。
    [cloudera@quickstart ~]$ ./manageFiles.sh
    processing /user/cloudera/test_dir/test.file1 file...
    dir not exist creating... /user/cloudera/trgt_dir/2013/01/01 
    file not exist: creating header... /user/cloudera/trgt_dir/2013/01/01/file_2013-01-01
    writing line: '1 Lorem 2013-01-01'  to file: /user/cloudera/trgt_dir/2013/01/01/file_2013-01-01
    dir not exist creating... /user/cloudera/trgt_dir/2013/02/01 
    file not exist: creating header... /user/cloudera/trgt_dir/2013/02/01/file_2013-02-01
    writing line: '2 Ipsum 2013-02-01'  to file: /user/cloudera/trgt_dir/2013/02/01/file_2013-02-01
    dir not exist creating... /user/cloudera/trgt_dir/2013/03/01 
    file not exist: creating header... /user/cloudera/trgt_dir/2013/03/01/file_2013-03-01
    writing line: '3 Ipsum 2013-03-01'  to file: /user/cloudera/trgt_dir/2013/03/01/file_2013-03-01
    processing /user/cloudera/test_dir/test.file2 file...
    writing line: '1 Lorem 2013-01-01'  to file: /user/cloudera/trgt_dir/2013/01/01/file_2013-01-01
    writing line: '2 Ipsum 2013-02-01'  to file: /user/cloudera/trgt_dir/2013/02/01/file_2013-02-01
    writing line: '3 Ipsum 2013-03-01'  to file: /user/cloudera/trgt_dir/2013/03/01/file_2013-03-01
    
    [cloudera@quickstart ~]$ hadoop fs -cat /user/cloudera/trgt_dir/2013/03/01/file_2013-03-01
    id name timestamp
    3 Ipsum 2013-03-01
    3 Ipsum 2013-03-01
    [cloudera@quickstart ~]$