1. 程式人生 > >【python 資料框寫入hdfs】windows使用python hdfs模組寫入hdfs的一個坑

【python 資料框寫入hdfs】windows使用python hdfs模組寫入hdfs的一個坑

目標:在windows平臺數據框寫入hdfs

# -*- encoding=utf-8 -*-

import hdfs
import datetime
import pandas as pd
import time
time1=time.time()


# 自定義獲取昨天日期的函式
def getYesterday():
    """
    :return: 獲取昨天日期
    """
    today = datetime.date.today()
    oneday=datetime.timedelta(days=1)
    yesterday=today-oneday
    # 日期轉字串
    partition_date=yesterday.strftime('%Y-%m-%d')
    return partition_date



# 資料框寫到hdfs檔案
def dataframe_write_to_hdfs(client, hdfs_path, dataframe):
    """
    :param client:
    :param hdfs_path:
    :param dataframe:
    :return:
    """
    client.write(hdfs_path, dataframe.to_csv(header=False,index=False,sep="\t"), encoding='utf-8',overwrite=True)


if __name__ == '__main__':

    partition_date=getYesterday()
	# 注意這裡用InsecureClient 這種方式,用對應的使用者寫入對應對應使用者擁有的許可權的目錄下
    client = hdfs.InsecureClient("host:50070",user='admin')
    
    
    hdfs_path = "/user/admin/deploy/user_lable_dimension/partition_type=brush/red-%s.txt" % partition_date

    # 讀取資料集
    data=pd.read_csv('C:/Users/xiaohu/Desktop/文字挖掘/使用者標籤體系二期/使用者身份標籤/使用者下單偏好/刷單/red-%s.txt' % partition_date,sep='\t')
    data.columns = ['app_id', 'user_id', 'login_name', 'cert_no', 'type', 'lable', 'value', 'record_date']

    print(data)

    # 呼叫函式上傳資料集到hdfs
    dataframe_write_to_hdfs(client,hdfs_path,data)
    
    time2 = time.time()
    print(u'ok,上傳dataframe資料集到hdfs結束!')
    print(u'總共耗時:' + str(time2 - time1) + 's')

windows平臺 寫入hdfs 並不會一帆風順,會出現如下異常資訊:

在這裡插入圖片描述

原因分析:

windows 寫入檔案到hdfs
本地window 機器需要與 叢集的各個DataNode節點保持網路通暢

解決辦法:
修改客戶機本地的對映,檔案是C:\Windows\System32\drivers\etc\host

修改host檔案

增加叢集的IP地址和域名的對應管理

最後成功寫入hdfs