使用Pyspark从ORC中提取数据

时间:2017-10-03 14:26:58

标签: python apache-spark pyspark orc

我有一个ORC文件,我可以使用Pyspark 2.2.0将其读入DataFrame

root
 |-- item: map (nullable = true)
 |    |-- key: string
 |    |-- value: string (valueContainsNull = true)

以上df的架构如下

item
{http_Accept-Language={"s":"en-US"}, Win64={"n":"1"}, 
geoip_region={"s":"FL"}, Platform={"s":"Win7"}, geoip_postal_code=
{"s":"33432"}, JavaApplets={"n":"1"}, http_Accept={"s":"*/*"}, 
Version={"s":"11.0"}, Cookies={"n":"1"}, Platform_Version=
{"s":"6.1"}, http_Content-Type={"s":"application/x-www-form-
urlencoded"}}
{http_Accept-Language={"s":"en-US"}, Win64={"n":"1"}, IFrames=
{"n":"1"}, geoip_region={"s":"CA"}, Platform={"s":"Win7"}, Parent=
{"s":"IE 11.0"}, http_Dnt={"n":"1"}} 

示例数据看起来像这样(只是一个示例数据而不是整个数据集)

expDf = df.select(explode("item"))

所以我爆炸了“项目”,如下所示

root
 |-- key: string (nullable = false)
 |-- value: string (nullable = true)

+------------+----------+
| key| value|
+------------+----------+
|geoip_region|
{
    "s": "FL"
}
|
| Tables|
{
   "n": "1"
}
|
+------------+----------+

以上DataFrame具有以下架构,当我执行show(2)时具有以下细节

{{1}}

如何从此DataFrame中选择数据?我尝试了不同的方法,但没有用。 所以我需要'geoip_region',其价值为'FL',依此类推。 任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:0)

我不确定您的完整用例,但如果只是要访问“item”中的键和值,您可以使用以下示例代码执行此操作:

row = df.select(df.item).collect()

上面的代码会为您提供Row对象的列表,例如[Row(item={http_Accept-Language={"s":"en-US"}, Win64={"n":"1"},....})]

然后选择行中的所有值:row_item = row[0]['item']

row_item['http_Accept']将授予您访问u"{"s":"en-US"}"

的权限

eval(row_item['http_Accept'])将为您提供一个字典,您可以从中获取其键值

我刚刚概述了这个过程,可以用循环编写来获取迭代中的所有键/值。

答案 1 :(得分:-1)

感谢Joshi的回复,由于某种原因,我的代码上没有找到row [0]错误,我在AWS胶水环境中运行这可能是一个原因。

我使用下面的代码得到了我想要的东西。

# Creating a DataFrame of the raw file

df = spark.read.orc("s3://leadid-sandbox/krish/lead_test/")

# Creating a temp view called Leads for the above dataFrame
df.createOrReplaceTempView("leads")

# Extracting the data using normal SQL from the above created Temp 
  View
tblSel = spark.sql("SELECT get_json_object(item['token'], '$.s') as 
token, get_json_object(item['account_code'], '$.s') as account_code 
from leads").show()