pyspark dataframe column:Hive列

时间:2018-04-25 12:32:27

标签: apache-spark dataframe hive

我有一个Hive表如下:

hive> describe stock_quote;
OK
tickerid                string                                      
tradeday                string                                      
tradetime               string                                      
openprice               string                                      
highprice               string                                      
lowprice                string                                      
closeprice              string                                      
volume                  string

以下Spark代码读取csv文件并尝试将记录插入Hive表:

sc = spark.sparkContext
lines = sc.textFile('file:///<File Location>')
rows = lines.map(lambda line : line.split(','))
rows_map = rows.map(lambda row : Row(TickerId = row[0], TradeDay = row[1], TradeTime = row[2], OpenPrice = row[3], HighPrice = row[4], LowPrice = row[5], ClosePrice = row[6], Volume = row[7]))
rows_df = spark.createDataFrame(rows_map)
rows_df.write.mode('append').insertInto('default.stock_quote')

我面临的问题是,当我在数据帧上调用show()函数时,它会按字母顺序打印列,如下所示

|ClosePrice|HighPrice|LowPrice|OpenPrice|TickerId|TradeDay|TradeTime|Volume|

,在表格中,它在TickerId(Hive表中的第一列)列中插入ClosePrice的值(DF中的第一列),在TradeDay列中插入HighPrice的值,依此类推。

试图在数据帧上调用select()函数,没有帮助。 试图将列名列表如下:

rows_df = spark.createDataFrame(rows_map, ["TickerId", "TradeDay", "TradeTime", "OpenPrice", "HighPrice", "LowPrice", "ClosePrice", "Volume"])

上面更改了列名称顺序,但值保持在同一位置,这更加不正确。

真的很感激任何帮助。

3 个答案:

答案 0 :(得分:3)

您也可以使用saveAsTable代替insertInto

来自docs

  

insertInto不同,saveAsTable会使用列名来查找正确的列位置

答案 1 :(得分:2)

您应该使用namedtuple代替Row,因为&#39;行&#39;尝试订购列名称。因此,有序列名称与default.stock_quote 表的列顺序不匹配请检查What is the Scala case class equivalent in PySpark?以获取更多详细信息

所以你应该这样做

from collections import namedtuple

table = namedtuple('table', ['TickerId', 'TradeDay', 'TradeTime', 'OpenPrice', 'HighPrice', 'LowPrice', 'ClosePrice', 'Volume'])
rows_map = rows.map(lambda row : table(row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7]))

正如@ user6910411建议的那样,&#34; 一个正常的元组也会这样做&#34;

rows_map = rows.map(lambda row : (row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7]))
rows_df = spark.createDataFrame(rows_map, ['TickerId', 'TradeDay', 'TradeTime', 'OpenPrice', 'HighPrice', 'LowPrice', 'ClosePrice', 'Volume'])

现在insertInto应该有效

答案 2 :(得分:1)

它是如何发生的,按字母顺序排序?它是如何在csv文件中的?

无论如何,我是按照以下步骤进行的:

  • 从表中选择列
  • 根据表格
  • 中的列重新排列数据框
# pyspark below
list_columns = spark.sql('select * from table').columns # there might be simpler way
dataframe.select(*list_columns)