代码之家  ›  专栏  ›  技术社区  ›  Daniel Kaplan

雅典娜怎么知道如何划分你的数据?

  •  0
  • Daniel Kaplan  · 技术社区  · 6 年前

    I've been reading this aws blog article

    CREATE EXTERNAL TABLE IF NOT EXISTS elb_logs_raw_native_part (
      request_timestamp string, 
      elb_name string, 
      request_ip string, 
      request_port int, 
      backend_ip string, 
      backend_port int, 
      request_processing_time double, 
      backend_processing_time double, 
      client_response_time double, 
      elb_response_code string, 
      backend_response_code string, 
      received_bytes bigint, 
      sent_bytes bigint, 
      request_verb string, 
      url string, 
      protocol string, 
      user_agent string, 
      ssl_cipher string, 
      ssl_protocol string ) 
    PARTITIONED BY(year string, month string, day string) -- Where does Athena get this data?
    ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
    WITH SERDEPROPERTIES (
             'serialization.format' = '1','input.regex' = '([^ ]*) ([^ ]*) ([^ ]*):([0-9]*) ([^ ]*)[:\-]([0-9]*) ([-.0-9]*) ([-.0-9]*) ([-.0-9]*) (|[-0-9]*) (-|[-0-9]*) ([-0-9]*) ([-0-9]*) \\\"([^ ]*) ([^ ]*) (- |[^ ]*)\\\" (\"[^\"]*\") ([A-Z0-9-]+) ([A-Za-z0-9.-]*)$' )
    LOCATION 's3://athena-examples/elb/raw/';
    

    当你没有告诉雅典娜数据的哪一部分是年、月或日时,雅典娜怎么知道如何划分这些数据呢?

    在博客文章的上下文中,它说年份来自文件名,但没有一步告诉雅典娜这个信息。文章说这是预定义的格式: https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-access-logs.html#access-log-entry-format 但我看不到年份栏。

    :这篇文章对此不是很明确,但我认为可能是说 PARTITIONED BY 列是s3存储桶中的子目录吗?换句话说,第一个元素 PARTITION BY year 在本例中)是bucket的第一个子目录,依此类推。

    0 回复  |  直到 6 年前
        1
  •  2
  •   Daniel Kaplan    6 年前

    This article ,这是链接,解释它比原来更好。

    要创建带有分区的表,必须在CREATETABLE语句中定义它。使用PARTITIONED BY定义对数据进行分区的键。以下部分讨论了两种情况:

    1. 数据已经被分区,存储在amazons3上,您需要访问雅典娜上的数据。

    2. 数据未分区。

    我的问题是关于1号的,上面写着

    分区存储在amazons3的不同文件夹中。例如, 以下是示例广告印象的部分列表:

    aws s3 ls s3://elasticmapreduce/samples/hive广告/表格/印象/

    PRE dt=2009-04-12-13-00/
    PRE dt=2009-04-12-13-05/
    PRE dt=2009-04-12-13-10/
    PRE dt=2009-04-12-13-15/
    PRE dt=2009-04-12-13-20/
    PRE dt=2009-04-12-14-00/
    PRE dt=2009-04-12-14-05/
    PRE dt=2009-04-12-14-10/
    PRE dt=2009-04-12-14-15/
    PRE dt=2009-04-12-14-20/
    PRE dt=2009-04-12-15-00/
    PRE dt=2009-04-12-15-05/ 
    

    在这里,存储日志时,列名(dt)设置为以日期、小时和分钟为增量。当你 给出一个包含父文件夹、架构和 分区列的名称,雅典娜可以查询这些列中的数据 子文件夹。

    该条(国际海事组织)的缺点是,它从来没有显示出一种安全性 aws s3 ls . 如果是的话,我就不会糊涂了。在本文中,假设有一个名为year、month和day的S3键。这个 PARTITION BY 指的是那些钥匙。

    如果您的文件没有像这样整齐地组织起来,您可以使用不同的sql语句来读入文件并对其进行分区(上面提到的场景2):

    ALTER TABLE elb_logs_raw_native_part ADD PARTITION (year='2015',month='01',day='01') location 's3://athena-examples/elb/plaintext/2015/01/01/'

        2
  •  1
  •   Martin Löper    6 年前

    找到丹尼尔很有趣!这让我想起了一个关于这个话题的老讨论。我想在这里发表一段摘录,也许有人觉得有用:

    我刚刚阅读了关于在S3[1]中划分数据的雅典娜文档。
    我想知道“场景1:数据已经分区并以配置单元格式存储在S3上”、“存储分区数据”中给出的示例:

    我的假设是正确的吗?为了能够自动对雅典娜中的数据进行分区,我必须在我的S3文件夹名称前面加上“partition\u key=actual\u folder\u name”?
    否则,我不明白为什么上面的示例ls命令返回以“dt=”前缀开头的S3键。

    参考文献:
    [1] https://docs.aws.amazon.com/athena/latest/ug/partitions.html

    回答

    我知道你有一些关于分区雅典娜根据AWS文件的问题

    回答你的问题:我的假设正确吗?为了能够自动对雅典娜中的数据进行分区,我必须在我的S3文件夹名称前面加上“partition\u key=actual\u folder\u name”?

    是的,为了自动检测雅典娜的分区,S3前缀应该是“key=value”对。否则,您必须使用'Alter Table。。Add Partition命令,如上述文档中所述。

    我知道您发现我们的文档在配置单元样式分区方面没有那么冗长。[…]但是,关于配置单元分区的描述较少的原因是,作为一个开放源代码工具,配置单元提供了详细解释配置单元样式分区的开放源代码文档。例如链接[1]等。


    [1] http://hadooptutorial.info/partitioning-in-hive/
    https://docs.aws.amazon.com/glue/latest/dg/add-crawler.html