как урезать значения для нескольких строк и столбцов в фрейме данных в spark scala - PullRequest
0 голосов
/ 09 марта 2019

у меня есть фрейм данных df id A B C D 1 1.000234 2.3456 4.6789 7.6934 2 3.7643 4.2323 5.6342 8.567

Я хочу создать еще один фрейм данных df1 с усеченными значениями до 2 разрядов после десятичной дроби

id  A    B    C    D
 1 1.00 2.35 4.68 7.70
 2 3.76 4.23 5.63 8.57 

Может кто-нибудь помочь мне с кодом в качестве моегофрейм данных состоит из 70 столбцов и 10000 строк

Ответы [ 3 ]

1 голос
/ 09 марта 2019

Это можно сделать очень легко, используя функцию format_number

val df = Seq(
    (1, 1.000234, 2.3456, 4.6789, 7.6934), 
    (2, 3.7643, 4.2323, 5.6342, 8.567)
    ).toDF("id", "A", "B", "C", "D")

df.show()

+---+--------+------+------+------+
| id|       A|     B|     C|     D|
+---+--------+------+------+------+
|  1|1.000234|2.3456|4.6789|7.6934|
|  2|  3.7643|4.2323|5.6342| 8.567|
+---+--------+------+------+------+

val df1 = df.select(col("id"), 
    format_number(col("A"), 2).as("A"), 
    format_number(col("B"), 2).as("B"), 
    format_number(col("C"), 2).as("C"), 
    format_number(col("D"), 2).as("D"))

df1.show()

+---+----+----+----+----+
| id|   A|   B|   C|   D|
+---+----+----+----+----+
|  1|1.00|2.35|4.68|7.69|
|  2|3.76|4.23|5.63|8.57|
+---+----+----+----+----+
0 голосов
/ 11 марта 2019

Вы можете разыграть, используя DecimalType (3,2), импортировав org.apache.spark.sql.types ._

scala> val df = Seq(
     |     (1, 1.000234, 2.3456, 4.6789, 7.6934),
     |     (2, 3.7643, 4.2323, 5.6342, 8.567)
     |     ).toDF("id", "A", "B", "C", "D")
df: org.apache.spark.sql.DataFrame = [id: int, A: double ... 3 more fields]

scala> df.show()
+---+--------+------+------+------+
| id|       A|     B|     C|     D|
+---+--------+------+------+------+
|  1|1.000234|2.3456|4.6789|7.6934|
|  2|  3.7643|4.2323|5.6342| 8.567|
+---+--------+------+------+------+


scala> import org.apache.spark.sql.types._
import org.apache.spark.sql.types._

scala> val df2=df.columns.filter(_ !="id").foldLeft(df){ (acc,x) => acc.withColumn(x,col(x).cast(DecimalType(3,2))) }
df2: org.apache.spark.sql.DataFrame = [id: int, A: decimal(3,2) ... 3 more fields]

scala> df2.show(false)
+---+----+----+----+----+
|id |A   |B   |C   |D   |
+---+----+----+----+----+
|1  |1.00|2.35|4.68|7.69|
|2  |3.76|4.23|5.63|8.57|
+---+----+----+----+----+


scala>
0 голосов
/ 11 марта 2019

Это один из способов динамического усечения значений в кадре данных, а не жестким способом

import org.apache.spark.sql.functions.round
val df1 = df.columns.foldLeft(df){(df,colName) =>df.withColumn(colName,round(col(colName),3))}

Это сработало для меня

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...