如果我有下表
+-----+-----+---+-----+-----+-----+-----+-----+-----+-----+
| a| b| id|m2000|m2001|m2002|m2003|m2004|m2005
+-----+-----+---+-----+-----+-----+-----+-----+-----+-----+
|a |world| 1| 0| 0| 1| 0| 0| 1|
+-----+-----+---+-----+-----+-----+-----+-----+-----+-----+
如何创建一个如下所示的新 Dataframe ,检查列m2000到m2014,并查看这些字段是否为1。然后创建下表,其中10/10为静态。使用2002和2005,因为m2000和m2014之间只有2列,其中1在上表中。
|id | year | yearend |
|1 | 10/10/2002| 12/12/2005|
|1 | 10/10/2002| 12/12/2005|
创建第一个 Dataframe 的代码
from pyspark.shell import spark
from pyspark.sql.types import StructType, StructField, StringType, IntegerType
data2 = [("a", "world", "1", 0, 0, 1,0,0,1),
]
schema = StructType([ \
StructField("a", StringType(), True), \
StructField("b", StringType(), True), \
StructField("id", StringType(), True), \
StructField("m2000", IntegerType(), True), \
StructField("m2001", IntegerType(), True), \
StructField("m2002", IntegerType(), True), \
StructField("m2003", IntegerType(), True), \
StructField("m2004", IntegerType(), True), \
StructField("m2005", IntegerType(), True), \
])
df = spark.createDataFrame(data=data2, schema=schema)
df.printSchema()
df.show(truncate=False)
2条答案
按热度按时间4urapxun1#
假设 Dataframe 具有更完整的场景,其中存在年份不为“1”的行和具有更多“1”的行:
| | 一种|B|标识符|M2000计算机|2001年中期|2002年中期|2003年中期|2004年中期|2005年中期|
| - -|- -|- -|- -|- -|- -|- -|- -|- -|- -|
| 第0页|一种|全世界|一个|第0页|第0页|一个|第0页|第0页|一个|
| 一个|B|全世界|2个|第0页|一个|第0页|一个|第0页|一个|
| 2个|C语言|全世界|三个|第0页|第0页|第0页|第0页|第0页|第0页|
为了方便起见,我把你的 Dataframe 传给Pandas,但我会使用简单的迭代结构,你可以把它集成到spark中。
我们检索不包括前3列的年份列表:
最后,生成所需 Dataframe 所需的代码如下(行内注解):
输出将为:
| | 标识符|年份|年底|
| - -|- -|- -|- -|
| 第0页|一个|二零零二年十月十日|二OO五年十二月十二日|
| 一个|2个|二零零一年十月十日|二OO五年十二月十二日|
i2byvkas2#
我们可以使用pyspark本机函数创建一个值为
1
的列名数组。然后,可以使用该数组获取年份的min
和max
以及"10/10/"
的concat
。下面是一个示例