apachespark—从dataframescala中选择列后,列值的顺序会发生更改

lqfhib0f  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(276)

我有一个要求,必须根据实体名获取表名。例如,如果实体名称为“quote\u header”,则应返回表名“q2cods.quote\u header\u tss”,如果实体名称为“quote\u line\u items”,则应返回表名“q2cods.quote\u line\u item\u tss”

val srcentity_dstTable = dataFrame.select("ENTITY_NM", "DS_TABLE_NM")
srcentity_dstTable.show(200)

这是一个Dataframe,它有两列:entity\u nm和ds\u table\u nm

当我选择entity\u nm column并将其转换为一个列表时,值的顺序与上面的dataframe不同。

val srcentity_columns = srcentity_dstTable.select("ENTITY_NM").collect().map(_ (0)).toList
println(srcentity_columns)
val dst_table_names = srcentity_dstTable.select("DS_TABLE_NM").collect().map(_ (0)).toList
println(dst_table_names)
 val mapcols = (srcentity_columns zip dst_table_names)
println(mapcols)

在这里,实体\u nm列表的顺序与dataframe不同,而是将所有quote\u标题放在第一位,将所有quote\u行\u项放在最后

请任何人让我知道为什么这种重新排序发生在实体\u nm只有当ds\u表\u nm列表是按顺序来的Dataframe。

pb3skfrl

pb3skfrl1#

一种方法是创建一个新列并收集该新列。
例如:

val list =List(("one", "A"), ("two", "A"), ("three", "B"), ("one", "B")).toDF

val df = list.toDF("ENTITY_NM", "DS_TABLE_NM")

df.show()

        +---------+-----------+
        |ENTITY_NM|DS_TABLE_NM|
        +---------+-----------+
        |      one|          A|
        |      two|          A|
        |    three|          B|
        |      one|          B|
        +---------+-----------+

 val newDF = df.withColumn(
                "new_column",
                concat($"ENTITY_NM", lit("-"), $"DS_TABLE_NM")
              )

 newDF.show
        +---------+-----------+----------+
        |ENTITY_NM|DS_TABLE_NM|new_column|
        +---------+-----------+----------+
        |      one|          A|     one-A|
        |      two|          A|     two-A|
        |    three|          B|   three-B|
        |      one|          B|     one-B|
        +---------+-----------+----------+

相关问题