從hdfs導入數據到hive表


在文件已經導入(存入)hdfs之后,需要建表進行映射才可以show tables。

現在假設文件已導入該hdfs目錄: /apps/hive/warehouse/db_name.db/tb_name (這里也可能是其他文件,如csv,txt等,如:/username/test/test.txt)

  • 方式一:建立的是外部分區表

1. 先按照hdfs中文件的字段,建立外部分區表:

create external table if not exists db_name.tb_name_2(id string, name string) partitioned by (day string) row format delimited fields terminated by '\1' STORED AS textfile LOCATION '/apps/hive/warehouse/db_name.db/tb_name/day=xxxxxxxx';             # location指向直到分區(假設分區為day字段,如果指向的表不是分區表,則直到該表即可——不管怎樣,要使得該目錄里就是數據)

2. 建立分區

alter table db_name.tb_name_2 add partition (day=xxxxxxxx) location '/apps/hive/warehouse/db_name.db/tb_name/day=xxxxxxxx';  

  • 方式二:建立的是外部非分區表,則location直接指向數據地址:

如果指向的數據地址是某個非分區表數據,則直接指向該表:

create external table if not exists db_name.tb_name_2(id string, name string) row format delimited fields terminated by '\1' STORED AS textfile LOCATION '/apps/hive/warehouse/db_name.db/tb_name';  

如果指向的數據地址只是某個表的分區,則直接指向分區數據(雖然建立的外部表不是分區表):

create external table if not exists db_name.tb_name_2(id string, name string) row format delimited fields terminated by '\1' STORED AS textfile LOCATION '/apps/hive/warehouse/db_name.db/tb_name/day=xxxxxxxx';  

  • 方式三:建立的是內部表:先建表,再load

建表:create table if not exists db_name.tb_name_2(id string, name string) row format delimited fields terminated by '\1' STORED AS textfile;  

load數據:load data inpath '/apps/hive/warehouse/db_name.db/tb_name' into table db_name.tb_name_2;

  •  方式四:如果嫌棄命令行麻煩,可以使用python代碼完成建表和插入語句(spark-sql)
import os
from pyspark import SparkContext, SparkConf
from pyspark.sql.session import SparkSession
from pyspark.sql import HiveContext
from pyspark.sql import SQLContext
from pyspark.storagelevel import StorageLevel
from pyspark.sql.types import StructField, StructType, StringType
import warnings
warnings.filterwarnings("ignore")

os.environ["PYSPARK_PYTHON"]="/root/anaconda3/envs/my_env/bin/python3.7"  #如果只有一個環境env,則可不必要

# local 模式
# sc = SparkContext('local', 'test')

# cluster模式
conf = SparkConf().setAppName('test')
conf.set(" "," ")    # 各種spark配置
sc = SparkContext(conf=conf)
# ------ spark
= SparkSession.builder.appName("SparkOnHive").enableHiveSupport().getOrCreate() #為了使用hive命令 hive_text = HiveContext(spark) #這個也可 sql_text = SQLContext(sc) import pandas as pd dt = pd.read_csv('xxxxxx') df = dt.rename(columns)=lambda x:x.replace(" ","").replace("\n","").replace("\t","") #變換列名,去掉不必要的字符 #schema=StructType( # RDD變成DataFrame需要schema # [StructField("id", StringType(), True), # StructField("name", StringType(), True), # StructField("sex", StringType(), True)] # ) data = hive_text.createDataFrame(df) # 從pandas的df變成pyspark的DataFrame hive_text.registerDataFrameAsTable(data, tableName="test_table") #此時產生了虛擬表 hive_text.sql("use db_name") hive_text.sql("create table if not exists tb_name(id string, name string, sex string) row format delimited fields terminated by '\1' STORED AS textfile") #開始執行sql語句,建表 hive_text.sql("insert overwrite table tb_name select * from test_table") # 虛擬表test_table可以直接使用 # hive_text.sql("alter table tb_name add if not exists partition(day=xxxxxxxx)") # 如果有分區,要先建分區 data_select = hive_text.sql("select * from xxxx") # 注意:得到的值data_select屬於pyspark的DataFrame格式 sc.stop()

內部表和外部表:

未被external修飾的是內部表,被external修飾的為外部表;

區別:
內部表數據由Hive自身管理,外部表數據由HDFS管理;
內部表數據存儲的位置是hive.metastore.warehouse.dir(默認:/user/hive/warehouse),外部表數據的存儲位置由自己制定;
刪除內部表會直接刪除元數據(metadata)及存儲數據;刪除外部表僅僅會刪除元數據,HDFS上的文件並不會被刪除;
對內部表的修改會將修改直接同步給元數據,而對外部表的表結構和分區進行修改,則需要修復(MSCK REPAIR TABLE table_name;)

#

參考:

https://blog.csdn.net/qq_44449767/article/details/99716613

https://www.jianshu.com/p/1a4dfd654786


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM