-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy path12_dataset.scala
75 lines (61 loc) · 2.35 KB
/
12_dataset.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
/*
Dizemos que Dataframes são Datasets do tipo Row, porque cada linha do meu Dataframe é composta por um objeto da classe Row
Quando utilizamos Datasets, podemos alterar este objeto do tipo Row para um objeto definido por nós mesmos. Tecnicamente, este objeto será
definido por uma Case Class (se for escrito em Scala) ou um Java Bean (se for escrito em Java)
Esta flexibilidade vem com um custo na questão do desempenho
Portanto, você deve preferir usar Datasets se:
- Não for possível realizar sua operação com Dataframes ou
- Você precisa de tipos de dados bem definidos (type-safety). Por exemplo, uma subtração entre duas Strings vai falhar durante a compilação
do código (e não em tempo de execução).
Sempre leve esses pontos em consideracao, já que o uso de datasets prejudicará o desempenho.
*/
case class Bank (
AGE: Int,
JOB: String,
MARITAL: String,
EDUCATION: String,
DEFAULT: String,
HOUSING: String,
LOAN: String,
CONTACT: String,
MONTH: String,
DAY_OF_WEEK: String,
DURATION: String,
CAMPAIGN: Int,
PDAYS: Int,
PREVIOUS: Int,
POUTCOME: String,
`EMP.VAR.RATE`: Double,
`CONS.PRICE.IDX`: Double,
`CONS.CONF.IDX`: Double,
EURIBOR3M: Double,
`NR.EMPLOYED`: Double,
Y: String
)
// Carrega arquivo CSV
val dados = spark.read.option("header","true").option("inferSchema","true").option("delimiter",";").format("csv").load("data/bank-additional-full.csv")
// Converte para Dataset
val dataset = dados.as[Bank]
// Verificando os tipos de objetos
dados
dataset
// Exibindo alguns registros do dataset
dataset.show(5)
/*
Basicamente, tudo que podemos fazer com Dataframes também é aceito em Datasets.
Porém, datasets possuem mais possibilidaes para se trabalhar com ações e transformações
No exemplo abaixo aplicaremos um filtro por meio de uma função
*/
// Exemplo que filtro por meio de uma função
def ageGreaterThan40 (row: Bank): Boolean = {
return row.AGE > 40
}
// Aplica filtro usando uma função
val dataset2 = dataset.filter(row => ageGreaterThan40(row))
// Confere se o dataset2 realmente não possui os dados que foram filtrados
dataset.filter(row => row.AGE < 40).show(5)
/*
Também podemos usar o comando .map para aplicar transformações no dataset
Usando a função map para extrair informações do dataset
*/
dataset.map(row => row.MARITAL).show(5)