我有一个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',依此类推。 任何帮助表示赞赏。
答案 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()