9

scala で DataFrame 列の名前を変更しようとしています。直接フィールドの列名を簡単に変更できますが、配列構造体の列を変換するときに問題に直面しています。

以下は私の DataFrame スキーマです。

|-- _VkjLmnVop: string (nullable = true)
|-- _KaTasLop: string (nullable = true)
|-- AbcDef: struct (nullable = true)
 |    |-- UvwXyz: struct (nullable = true)
 |    |    |-- _MnoPqrstUv: string (nullable = true)
 |    |    |-- _ManDevyIxyz: string (nullable = true)

しかし、以下のようなスキーマが必要です

|-- vkj_lmn_vop: string (nullable = true)
|-- ka_tas_lop: string (nullable = true)
|-- abc_def: struct (nullable = true)
 |    |-- uvw_xyz: struct (nullable = true)
 |    |    |-- mno_pqrst_uv: string (nullable = true)
 |    |    |-- man_devy_ixyz: string (nullable = true)

非構造列の場合、以下で列名を変更しています

def aliasAllColumns(df: DataFrame): DataFrame = {
  df.select(df.columns.map { c =>
    df.col(c)
      .as(
        c.replaceAll("_", "")
          .replaceAll("([A-Z])", "_$1")
          .toLowerCase
          .replaceFirst("_", ""))
  }: _*)
}
aliasAllColumns(file_data_df).show(1)

構造体の列名を動的に変更するにはどうすればよいですか?

4

2 に答える 2

0

私の知る限り、ネストされたフィールドの名前を直接変更することはできません。

片側から、平らな物体に移動してみてください。

ただし、構造を維持する必要がある場合は、spark.sql.functions.struct(*cols)で遊ぶことができます。

Creates a new struct column.
Parameters: cols – list of column names (string) or list of Column expressions

すべてのスキーマを分解し、必要なエイリアスを生成してから、関数を使用して再度構成する必要がありstructます。

それは最善の解決策ではありません。しかし、それは何かです:)

Pd: Scala よりも優れた説明が含まれているため、PySpark のドキュメントを添付します。

于 2019-03-26T17:06:42.507 に答える