首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从pyspark中的列表中提取列

从pyspark中的列表中提取列
EN

Stack Overflow用户
提问于 2020-12-18 11:30:32
回答 2查看 525关注 0票数 1

我一直在尝试从列表中提取列,但无法想象如何做到这一点。我对spark来说还是个新手。在Spark 2.4.3上运行pyspark。

我有一个像这样组织的json:

代码语言:javascript
运行
复制
{ "meta" : { ... },
  "data" : 
  [[ "a", 0, null, "{ }"],
   [ "b", 0, null, "{ }"],
   [ "c", 0, null, "{ }"],
   ] }

我想把'data‘部分放到列中,比如

代码语言:javascript
运行
复制
 +------+------+------+------+
 | col1 | col2 | col3 | col4 |
 +------+------+------+------+
 |   a  |   0  | None | "{ }"|
 |   b  |   0  | None | "{ }"|
 |   c  |   0  | None | "{ }"|

我读入了我的数据帧,printSchema()显示了这一点。

代码语言:javascript
运行
复制
root
 |-- data: array (nullable = true)
 |    |-- element: array (containsNull = true)
 |    |    |-- element: string (containsNull = true)
 |-- meta: struct (nullable = true)
 |    |-- view: struct (nullable = true)
 |    |    |-- approvals: array (nullable = true) ...

我的粗略形状是70列乘650k行。

我能够爆炸df,只获得data部分,但被困在那里。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-18 14:11:23

首先分解行,然后使用Python中的[]选择数组元素。

代码语言:javascript
运行
复制
df2 = df.select(F.explode('data').alias('data')) \
        .select(*[F.col('data')[i].alias('col%s'%(i+1)) for i in range(4)])

df2.show()
+----+----+----+----+
|col1|col2|col3|col4|
+----+----+----+----+
|   a|   0|null| { }|
|   b|   0|null| { }|
|   c|   0|null| { }|
+----+----+----+----+
票数 1
EN

Stack Overflow用户

发布于 2020-12-18 15:56:04

为什么不直接使用SparkSession.createDataFrame()方法呢?

https://spark.apache.org/docs/2.4.3/api/python/pyspark.sql.html#pyspark.sql.SparkSession.createDataFrame

您可以向此方法提供数据和模式参数,并获取spark dataframe。

示例:

代码语言:javascript
运行
复制
from pyspark.sql import SparkSession

sparkSession = SparkSession.builder.getOrCreate()
df = sparkSession.createDataFrame(data)

如果spark无法从数据中推断出模式,则还需要提供模式

代码语言:javascript
运行
复制
from pyspark.sql.types import StructType

struct = StructType()
struct.add("col1", "string", True)
struct.add("col2", "integer", True)
struct.add("col3", "string", True)
struct.add("col4", "string", True)


df = sparkSession.createDataFrame(data=data, schema=struct)

此外,您可以使用pyspark类型类而不是python原始类型名称。https://spark.apache.org/docs/2.4.3/api/python/pyspark.sql.html#module-pyspark.sql.types

模块包含两种简单类型(StringType、IntegerType等)和复杂类型(ArrayType、MapType等)

最后注意:数据不能包含null,在python中应该是None。spark DataFrame.show()将把None列打印为null

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65351449

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档