#! /usr/bin/perl -w # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. use strict; use Data::Dumper; my %primitive = ( 'int' => 1, 'byte' => 1, 'string' => 1, 'float' => 1, 'long' => 1, ); sub get_hive_cols($) { my $col = shift; my $cmd = "echo 'describe $col;' | /mnt/vol/hive/stable/bin/hive_cli.py | grep '|'"; #print "$cmd\n"; my @cols = `$cmd`; map { s/\|//g; s/^\s+//g; s/\s+$//g; s/\s+/ /g; } @cols; #print Dumper(\@cols); return @cols; } sub get_cols($$$) { my ($msg, $c, $t) = @_; if ($primitive{lc($t)}) { print "$msg$t:$c\n"; return; } elsif ($t =~ /List<(.*?)>/ and $primitive{lc($1)}) { print "$msg$t:$c\n"; return; } my @cols = &get_hive_cols($c); die "no cols!" unless @cols; print "$msg$t {\n"; foreach (@cols) { my ($name, $type) = split; $name = "$c.$name"; &get_cols($msg."\t", $name, $type); } print "$msg}//$t\n"; } #die "Usage: dump_schema tableName\n" unless @ARGV; my $tablename = $ARGV[0]; $tablename = "." unless $tablename; eval { &get_cols("", $tablename, $tablename); }; if ($@) { my $cmd = "echo show | /mnt/vol/hive/stable/bin/hive_cli.py | grep '|' | tr '|' '\\n' | awk '{print \$1}' | grep -v ^\$ | grep $tablename | sort"; my @tables = `$cmd`; print @tables; }