我想从 hdfs 中的 json 文件创建一个 pyspark 数据框。
json 文件具有以下内容:
{“产品”:{“0”:“台式电脑”,“1”:“平板电脑”,“2”:“iPhone”,“3”:“笔记本电脑”},“价格”:{“0”:700 , "1": 250, "2": 800, "3": 1200 } }
然后,我使用 pyspark 2.4.4 读取此文件 df = spark.read.json("/path/file.json")
所以,我得到这样的结果:
df.show(truncate=False)
+---------------------+---------------------------------+
|Price |Product |
+---------------------+---------------------------------+
|[700, 250, 800, 1200]|[Desktop, Tablet, Iphone, Laptop]|
+---------------------+---------------------------------+
Run Code Online (Sandbox Code Playgroud)
但我想要一个具有以下结构的数据框:
+-------+--------+
|Price |Product |
+-------+--------+
|700 |Desktop |
|250 |Tablet |
|800 |Iphone |
|1200 |Laptop |
+-------+--------+
Run Code Online (Sandbox Code Playgroud)
如何使用 pyspark 获取具有先前结构的数据框?
我尝试使用爆炸,df.select(explode("Price"))但出现以下错误:
---------------------------------------------------------------------------
Py4JJavaError Traceback (most recent call last)
/usr/lib/spark/python/pyspark/sql/utils.py in deco(*a, **kw)
62 try:
---> …Run Code Online (Sandbox Code Playgroud) 注意:这不是以下内容的重复(或其他几个类似的讨论)
我有一个Hive表,我必须纯粹通过Spark-SQL-query读取和处理。该表有一个string-type 列,其中包含JSON来自 API 的转储;因此,正如预期的那样,它具有深度嵌套的字符串化 JSON。
让我们看这个例子(它描述了我正在尝试处理的数据的确切深度/复杂性)
{
"key1": ..
"key2": ..
..
"bill_summary": {
"key1": ..
"key2": ..
..
"items": [
{
"item": {
"key1": ..
"key2": ..
..
"type": "item_type_1"
..
"total_cost": 57.65
..
}
},
{
"item": {
"key1": ..
"key2": ..
..
"total_cost": 23.31
..
}
}
..
{ …Run Code Online (Sandbox Code Playgroud) 我将以下JSON作为DataFrame加载:
root
|-- data: struct (nullable = true)
| |-- field1: string (nullable = true)
| |-- field2: string (nullable = true)
|-- moreData: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- more1: string (nullable = true)
| | |-- more2: string (nullable = true)
| | |-- more3: string (nullable = true)
Run Code Online (Sandbox Code Playgroud)
我想从这个DataFrame中获取以下RDD:
RDD[(more1, more2, more3, field1, field2)]
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?我想我必须使用flatMap嵌套的JSON?
我有一个json对象,它有一个不幸的嵌套和数组组合.所以用spark sql查询它并不是很明显.
这是一个示例对象:
{
stuff: [
{a:1,b:2,c:3}
]
}
Run Code Online (Sandbox Code Playgroud)
所以,在javascript中,为了获得价值c,我会写myData.stuff[0].c
在我的spark sql查询中,如果该数组不存在,我将能够使用点表示法:
SELECT stuff.c FROM blah
Run Code Online (Sandbox Code Playgroud)
但我不能,因为最里面的对象被包裹在一个数组中.
我试过了:
SELECT stuff.0.c FROM blah // FAIL
SELECT stuff.[0].c FROM blah // FAIL
Run Code Online (Sandbox Code Playgroud)
那么,选择这些数据的神奇方法是什么?或者甚至支持了吗?
我有一个带有单列的 DataFrame,它是一个结构数组
df.printSchema()
root
|-- dataCells: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- label: string (nullable = true)
| | |-- value: string (nullable = true)
Run Code Online (Sandbox Code Playgroud)
一些示例数据可能如下所示:
df.first()
Row(dataCells=[Row(label="firstName", value="John"), Row(label="lastName", value="Doe"), Row(label="Date", value="1/29/2018")])
Run Code Online (Sandbox Code Playgroud)
我试图弄清楚如何通过将每个结构转换为命名列来重新格式化此 DataFrame。我想要一个像这样的数据框:
------------------------------------
| firstName | lastName | Date |
------------------------------------
| John | Doe | 1/29/2018 |
| .... | ... | ... |
Run Code Online (Sandbox Code Playgroud)
我已经尝试了我能想到的一切,但还没有弄清楚。