PySparkにおける数値の切り上げ(roundup)と切り捨て(rounddown)

PySparkでは、数値の切り上げ(roundup)や切り捨て(rounddown)を効率的に行うための関数が提供されています。これらの操作は、データ処理や分析の際に非常に役立ちます。この記事では、PySparkを使用して数値の切り上げおよび切り捨てを行う方法について解説します。

1. PySparkのセットアップ

まず、PySparkの環境をセットアップします。以下のコマンドでPySparkをインストールします。

pip install pyspark

次に、必要なライブラリをインポートし、SparkSessionを作成します。

from pyspark.sql import SparkSession
from pyspark.sql.functions import ceil, floor

# SparkSessionの作成
spark = SparkSession.builder.appName("RoundExample").getOrCreate()

2. サンプルデータの作成

以下のコードを使用して、サンプルの数値データを含むデータフレームを作成します。

from pyspark.sql import Row

# サンプルデータの作成
data = [
    Row(value=4.3),
    Row(value=4.7),
    Row(value=5.1),
    Row(value=5.9)
]

# データフレームの作成
df = spark.createDataFrame(data)
df.show()
+-----+
|value|
+-----+
|  4.3|
|  4.7|
|  5.1|
|  5.9|
+-----+

3. 数値の切り上げ(roundup)

数値を切り上げるためには、ceil関数を使用します。ceil関数は、引数として渡された数値を超えない最小の整数を返します。

# 切り上げの適用
df_with_ceil = df.withColumn("rounded_up", ceil(df["value"]))
df_with_ceil.show()
+-----+----------+
|value|rounded_up|
+-----+----------+
|  4.3|         5|
|  4.7|         5|
|  5.1|         6|
|  5.9|         6|
+-----+----------+

4. 数値の切り捨て(rounddown)

数値を切り捨てるためには、floor関数を使用します。floor関数は、引数として渡された数値以下の最大の整数を返します。

# 切り捨ての適用
df_with_floor = df.withColumn("rounded_down", floor(df["value"]))
df_with_floor.show()
+-----+------------+
|value|rounded_down|
+-----+------------+
|  4.3|           4|
|  4.7|           4|
|  5.1|           5|
|  5.9|           5|
+-----+------------+

5. 応用例

5.1 複数列に対する切り上げと切り捨ての適用

複数の列に対して切り上げおよび切り捨てを同時に適用する場合の例です。

from pyspark.sql.functions import col

# 列を追加してサンプルデータを拡張
data_extended = [
    Row(value1=4.3, value2=7.8),
    Row(value1=4.7, value2=7.3),
    Row(value1=5.1, value2=6.6),
    Row(value1=5.9, value2=6.2)
]

df_extended = spark.createDataFrame(data_extended)

# 切り上げと切り捨ての適用
df_rounded = df_extended.withColumn("rounded_up_value1", ceil(col("value1"))) \
                        .withColumn("rounded_down_value1", floor(col("value1"))) \
                        .withColumn("rounded_up_value2", ceil(col("value2"))) \
                        .withColumn("rounded_down_value2", floor(col("value2")))

df_rounded.show()
+------+------++---------------+-----------------+---------------+-----------------+
|value1|value2|rounded_up_value1|rounded_down_value1|rounded_up_value2|rounded_down_value2|
+------+------++---------------+-----------------+---------------+-----------------+
|   4.3|   7.8|                5|                4|                8|                7|
|   4.7|   7.3|                5|                4|                8|                7|
|   5.1|   6.6|                6|                5|                7|                6|
|   5.9|   6.2|                6|                5|                7|                6|
+------+------++---------------+-----------------+---------------+-----------------+

5.2 特定の桁数での切り上げと切り捨て

PySparkでは、特定の桁数で切り上げや切り捨てを行うことも可能です。ここでは、小数点第2位での切り上げと切り捨ての例を示します。

from pyspark.sql.functions import round, lit

# 小数点第2位での切り上げと切り捨てのカスタム関数
def ceil_to_decimals(col_name, decimals=2):
    factor = 10 ** decimals
    return ceil(col(col_name) * factor) / factor

def floor_to_decimals(col_name, decimals=2):
    factor = 10 ** decimals
    return floor(col(col_name) * factor) / factor

# 切り上げと切り捨ての適用
df_decimal_rounded = df_extended.withColumn("rounded_up_value1_2d", ceil_to_decimals("value1")) \
                                .withColumn("rounded_down_value1_2d", floor_to_decimals("value1")) \
                                .withColumn("rounded_up_value2_2d", ceil_to_decimals("value2")) \
                                .withColumn("rounded_down_value2_2d", floor_to_decimals("value2"))

df_decimal_rounded.show()
+------+------+------------------+--------------------+------------------+--------------------+
|value1|value2|rounded_up_value1_2d|rounded_down_value1_2d|rounded_up_value2_2d|rounded_down_value2_2d|
+------+------+------------------+--------------------+------------------+--------------------+
|   4.3|   7.8|               4.30|                 4.30|                7.80|                 7.80|
|   4.7|   7.3|               4.70|                 4.70|                7.30|                 7.30|
|   5.1|   6.6|               5.10|                 5.10|                6.60|                 6.60|
|   5.9|   6.2|               5.90|                 5.90|                6.20|                 6.20|
+------+------+------------------+--------------------+------------------+--------------------+

まとめ

PySparkを使用して数値の切り上げ(roundup)および切り捨て(rounddown)を行う方法を解説しました。ceil関数を使用して数値を切り上げ、floor関数を使用して数値を切り捨てることができます。これらの操作を応用して、特定の桁数での切り上げや切り捨て、複数の列に対する処理を効率的に行うことが可能です。

この記事が、PySparkにおける数値の切り上げおよび切り捨ての理解と実践に役立つことを願っています。

よかったらシェアしてね!
目次
閉じる