Arraytype> の複雑な列データ型を持つデータフレームがあります。このデータフレームを変換するために、Array [ケースクラス] をパラメーターとして使用してこの列を使用できる udf を作成しました。ここでの主なボトルネックは、stucttype に従ってケース クラスを作成するときに、structfield 名に「##field」などの特殊文字が含まれていることです。そこで、このようにケースクラス ( ##field
) のようにケースクラスに同じ名前を付けて、これを udf パラメータにアタッチします。Spark udf 定義で解釈された後、ケース クラス フィールドの名前をこの "$hash$hashfield" に変更します。このデータフレームを使用して変換を実行すると、このミスマッチのために失敗します。助けてください ...
エンコードされた形式とマップすることはできません現在、スパークでのJVMの制限Scalaの店舗識別子に起因##field
します$hash$hashfield
。
考えられる解決策の 1 つは、生の行からフィールドを手動で抽出することです (ただし、フィールドの順序を知る必要があります。そのためにdf
使用できますdf.schema
)。
val myUdf = udf { (struct: Row) =>
// Pattern match struct:
struct match {
case Row(a: String) => Foo(a)
}
// .. or extract values from Row
val `##a` = struct.getAs[String](0)
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加