使用Dictionary

时间:2017-11-20 16:02:36

标签: apache-spark pyspark apache-spark-sql amazon-dynamodb spark-dataframe

此问题与PySpark converting a column of type 'map' to multiple columns in a dataframe

不重复

上面的问题只是提取地图数据类型的值,下面我的问题是map,其中一列是一个与上述问题无关的字典。

我有一个ORC格式的DynamoDB json文件,当我使用SparkSession读取文件时,它的模式是

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

我需要从这个DataFrame中选择一些容易的列,因为我可以使用带有列名的from_json()项来完成它。 但我面临的挑战是在选择列时,其中一列是字典“ init ”,如果填充时我必须从该列中选择列值。

我的示例数据如下所示。

{sequence_number={"n":"15"}, page_id={"s":"ed04a04f-edef-4d40-9266-eb5025c50eb0"}, init={"s":"[{\"type\":1,\"id\":\"CONTACT_CITIZEN_US\",\"name\":\"CONTACT[CITIZEN]\",\"label\":\"UNITED STATES\",\"checked\":true,\"value\":\"US\",\"labelvisibility\":{\"textColor\":\"rgb(51, 51, 51)\",\"backgroundColor\":\"rgba(255, 255, 255, 1)\",\"boxWidth\":105.0625,\"boxHeight\":20,\"parentsDisplayed\":true,\"childrenDisplayed\":true,\"textSize\":\"14px\"},\"fieldvisibility\":{\"boxWidth\":16,\"boxHeight\":16,\"parentsDisplayed\":true,\"childrenDisplayed\":true},\"element_id\":8,\"label_element_id\":9}]"}, client_time={"n":"1506790579036"}, created={"n":"1506790579.1074"}, http_X-Forwarded-For={"s":"108.212.112.22, 10.3.7.56"}, http_User-Agent={"s":"Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1"}, http_Content-Length={"n":"1125"}, token={"s":"AB8D6195-C3F6-520F-EB5D-FC1CB9BED582"}, execution_time={"n":"6"}}

'init'列中可以包含任意数量的键值。

我尝试过使用spark SQL和像explode这样的函数,并尝试选择关闭列来提取我需要的值,但没有运气。

这是我选择

时所需要的
sequence_number  page_id               type  id
15             ed04a04f-edef-....       1     CONTACT_CITIZEN_US

如果你执行了from_json(),它将处理这些列值中的's'或'n'的dynamoDB模式。 我就像被困在这里一样,非常感谢任何帮助。

0 个答案:

没有答案