私はApache Spark 2.1.1を使用しています。算術比較のためにInt値を含む文字列にはキャスティングが必要ですか?
私は次のようにデータセットを持っています。
final case class TestModel(id: String,
code: String,
measure: String,
value: String)
私はcsvファイルから適切にロードしています。異なるmeasure
値の場合、value
データ型が異なる可能性があります。例えば。 measureが 'Age'の場合、value
は文字列の年齢になります。ここでいくつかの処理を行うために、value
をIntegerTypeにキャストして、別のデータセットで指定された年齢の範囲との比較を行っています。 これを行うには、以下の正しい方法がありますか?
val testData = spark.read.schema(testSchema).option("header", "false").csv(dataPath).as[TestModel]
val ageBasedTestData = testData.filter($"measure" === "Age")
var ageBasedData = ageBasedTestData.join(anotherDS, ageBasedTestData("code") === anotherDS("code") &&
anotherDS("ages").getItem(0) <= ageBasedTestData("value").cast(IntegerType) &&
anotherDS("ages").getItem(1) > ageBasedTestData("value").cast(IntegerType))
.select(some column names)
これを行うの年齢範囲との比較の前にInterger型にvalue
列の上記鋳造正しい方法はありますか?基本的には、文字列を比較目的のためにIntに変換していますが、データ型は気にしません。私は、キャストとキャストの両方でコードを実行して、両方私は同じ結果を与える。だから私はキャストなしで何が起こっているのかわからない。自動的に文字列をIntにキャストして比較しますか?重要であれば、anotherDSデータセットからの "age"配列のデータ型はIntegerです。
udf関数を使うことをお勧めします。ちょうどそれらに参加し、後でudf関数を使用してフィルタを適用してください –
@RameshMaharjan私はudf関数は最適化できないので、落胆していると思います。また、私はこの単純な文脈のためにudfが必要だとは思わない。 – user238607