如何向具有行计数的Pyspark数据框添加尾部行

pxyaymoc  于 2022-11-01  发布在  Spark
关注(0)|答案(1)|浏览(130)

第一个
所需输出:

  • 需要为列“firstname”添加额外的行“T”和行计数,如下所示。列“firstname”可以是任何类型。
+---+---------+--------+------+------+
|  S|firstname|lastname|gender|salary|
+---+---------+--------+------+------+
|  D|    James|   Smith|     M|  3000|
|  D|     Anna|    Rose|     F|  4100|
|  D|   Robert|Williams|     M|  6200|
|  T|      3  |        |      |      |
+---+---------+--------+------+------+

尝试创建一个带有尾部值的新 Dataframe ,并按照大多数stacoverflow解决方案的建议应用联合-但两个 Dataframe 的列数应该相同。是否有更好的方法使尾部中的计数与“firstname”列的列类型无关?

rkue9o1l

rkue9o1l1#

由于您希望创建一个新行而不考虑列类型,因此可以编写一个函数,该函数将列名作为输入,并返回一个字典,其中包含新行的所有必要信息,包括该列中的项数。
要创建如图所示的输出pyspark Dataframe ,每一列都必须是字符串类型,因为新行中的lastname, gender, salary列必须包含空字符串''。(请参阅here),因此当您在df2total_row_df之间建立并集时,total_row_df中字串类型的任何数据行都会在产生的数据框中胁迫转换为字串类型。

from pyspark.sql.functions import count

def create_total_row(col_name):
    total_row = {}
    for col in df2.columns:
        if col == 'S':
            total_row[col] = 'T'
        elif col == col_name:
            total_row[col] = df2.select(count(df2[col_name])).collect()[0][0]
        else:
            total_row[col] = ''
    return total_row

total_row = create_total_row('firstname')
total_row_df = spark.createDataFrame([total_row])
df2.union(total_row_df).show()

结果:

+---+---------+--------+------+------+
|  S|firstname|lastname|gender|salary|
+---+---------+--------+------+------+
|  D|    James|   Smith|     M|  3000|
|  D|     Anna|    Rose|     F|  4100|
|  D|   Robert|Williams|     M|  6200|
|  T|        3|        |      |      |
+---+---------+--------+------+------+

相关问题