Hive查询结果中的NULL列名称

时间:2016-11-13 11:49:05

标签: hive hiveql hadoop2

我已从NOAA下载了天气.txt文件,如下所示:

hive> select * from weather limit 10;

然后我创建了下表:

WBAN    Date    Time    NULL    SkyCondition    SkyConditionFlag    NULL    VisibilityFlag  WeatherType WeatherTypeFlag NULL    DryBulbFarenheitFlag    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULLNULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    RecordType  RecordTypeFlag  NULL    NULL    NULL    NULL
00102   20150101    0001    0   OVC043      10              27      -3  NULL    26  NULL    -3  NULL25  NULL    -4  NULL    NULL    NULL    NULL    NULL    0   NULL    NULL    NULL    30  NULL    NULL    NULL    NULL    NULL    30  NULL    AA      NULL    NULL    30  NULL
00102   20150101    0101    0   OVC045      10              27      -3  NULL    26  NULL    -3  NULL25  NULL    -4  NULL    NULL    NULL    NULL    NULL    80  NULL    NULL    NULL    30  NULL    NULL    NULL    NULL    NULL    30  NULL    AA      NULL    NULL    30  NULL
00102   20150101    0201    0   OVC047      10  

现在,如果我尝试一个简单的查询,如:

hive> select Visibility from weather limit 10;

我得到如下结果,并用Null替换了一些列的名字!

blog view

正如您可能已经注意到的那样,第四列和第七列(以及之后的许多列)在它们应分别为StationType和Visibility等时倾斜为NULL!

即使我尝试过:

<?php   include('header.php');  ?>
<?php
    $article_id = $_POST['article'];
    // echo $article_id;
   $dbhost = 'localhost';
   $dbuser = 'root';
   $dbpass = 'password';
   $con = mysql_connect($dbhost, $dbuser , $dbpass);
   $sql = 'SELECT id,blog_title, blog_body, views FROM tinyblog where id="'. $article_id .'" ';
   // UPDATE VIEWS.
   mysql_query("UPDATE tinyblog SET views = views + 1 WHERE id = {$article_id}" , $con );
      mysql_select_db('tinyblog');
      $retval = mysql_query( $sql, $con );

      if(! $retval ) {
         die('Could not get data: ' . mysql_error());
      }

   while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) {
   ?>

   <div class="article-blog-indiv">
       <?php    
          echo '<h1>'. $row['blog_title'] .'</h1>';   
        echo '<p>'. $row['blog_body'] .'</p>';
       ?>
   </div>       
<?php           
   }
?>
<?php   include('footer.php');  ?>

我将获得正确的结果,但是使用NULL列标题/名称!!!

为什么NULL列名称/标题?!

2 个答案:

答案 0 :(得分:4)

有趣的问题,我花了一分钟才意识到正在发生的事情但是对蜂巢的正确认识实际上是显而易见的!

  1. 这里要注意的第一件事是NULL值出现在非String类型的列中。
  2. 要意识到的第二件事是蜂巢(例如,不像直线)通常不会在您选择的上方打印列标题。
  3. 所以,将1和2放在一起:

    • 列名称很好,您可以从Describe Weather
    • 等查询中看到
    • 您用作数据源的文件似乎在第一行上有列名。这些现在构成了你的hive表的第一行。当然,string类型的列在处理这些数据时没有问题,但是当int要求它们处理无法正确转换为int的字符串时,int类型的列将显示为NULL。

    建议:

    尝试摆脱第一行,最好是在创建外部表之前。

答案 1 :(得分:0)

要添加到上面的Dennis的评论中,如果您使用的是CSV SerDe,则可以跳过将第一行插入表格的操作,

settings.py

手术线为:

CREATE EXTERNAL TABLE cases (
  id INT,
  case_number STRING,
  name STRING,
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
STORED AS TEXTFILE
LOCATION '/hdfs/path'
tblproperties("skip.header.line.count"="1");