generated from HuemulSolutions/BigDataGovernance_2.6_TemplateBase
-
Notifications
You must be signed in to change notification settings - Fork 0
/
raw_entidad_mes.scala
145 lines (123 loc) · 6.62 KB
/
raw_entidad_mes.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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
package com.yourcompany.yourapplication.datalake
import com.yourcompany.yourapplication.globalSettings._
import com.huemulsolutions.bigdata.common._
import com.huemulsolutions.bigdata.control._
import com.huemulsolutions.bigdata.datalake._
import org.apache.spark.sql.types._
//ESTE CODIGO FUE GENERADO A PARTIR DEL TEMPLATE DEL SITIO WEB
/**
* Clase que permite abrir un archivo de texto, devuelve un objeto huemul_dataLake con un DataFrame de los datos
* ejemplo de nombre: raw_institucion_mes
*/
class raw_entidad_mes(huemulBigDataGov: huemul_BigDataGovernance, Control: huemul_Control) extends huemul_DataLake(huemulBigDataGov, Control) with Serializable {
this.Description = "Decripción de la interfaz"
this.GroupName = "[[yourapplication]]"
this.setFrequency(huemulType_Frequency.MONTHLY)
//Crea variable para configuración de lectura del archivo
val CurrentSetting: huemul_DataLakeSetting = new huemul_DataLakeSetting(huemulBigDataGov)
//setea la fecha de vigencia de esta configuración
.setStartDate(2010,1,1,0,0,0)
.setEndDate(2050,12,12,0,0,0)
//Configuración de rutas globales
.setGlobalPath(huemulBigDataGov.GlobalSettings.RAW_SmallFiles_Path)
//Configura ruta local, se pueden usar comodines
.setLocalPath("[[yourapplication]]/")
//configura el nombre del archivo (se pueden usar comodines)
.setFileName("[[name.TXT]]")
//especifica el tipo de archivo a leer
.setFileType(huemulType_FileType.TEXT_FILE)
//expecifica el nombre del contacto del archivo en TI
.setContactName("[[nombre de contacto del origen]]")
//Indica como se lee el archivo
.setColumnDelimiterType(huemulType_Separator.CHARACTER) //POSITION;CHARACTER
//separador de columnas
.setColumnDelimiter("\t") //SET FOR CARACTER
//forma rápida de configuración de columnas del archivo
//CurrentSetting.DataSchemaConf.setHeaderColumnsString("institucion_id;institucion_nombre")
//Forma detallada
.addColumn("ejemplo_producto_id", "pk", IntegerType, "codigo del producto")
.addColumn("fecha_venta", "fecven", StringType, "fecha de la venta")
.addColumn("cantidad", "cant", DecimalType(10,2), "Cantidad del producto")
.addColumn("precio", "prec", DecimalType(10,2), "Precio de la transaccion")
//Seteo de lectura de información de Log (en caso de tener)
.setHeaderColumnDelimiterType(huemulType_Separator.CHARACTER) //POSITION;CHARACTER;NONE
.setHeaderColumnDelimiter(";")
.setHeaderColumnsString("VACIO")
.setLogNumRowsColumnName(null)
this.SettingByDate.append(CurrentSetting)
/***
* open(ano: Int, mes: Int) <br>
* método que retorna una estructura con un DF de detalle, y registros de control <br>
* ano: año de los archivos recibidos <br>
* mes: mes de los archivos recibidos <br>
* dia: dia de los archivos recibidos <br>
* Retorna: true si todo está OK, false si tuvo algún problema <br>
*/
def open(Alias: String, ControlParent: huemul_Control, ano: Integer, mes: Integer, dia: Integer, hora: Integer, min: Integer, seg: Integer): Boolean = {
//Crea registro de control de procesos
val control = new huemul_Control(huemulBigDataGov, ControlParent, huemulType_Frequency.ANY_MOMENT)
//Guarda los parámetros importantes en el control de procesos
control.AddParamYear("Ano", ano)
control.AddParamMonth("Mes", mes)
try {
//NewStep va registrando los pasos de este proceso, también sirve como documentación del mismo.
control.NewStep("Abre archivo RDD y devuelve esquemas para transformar a DF")
if (!this.OpenFile(ano, mes, dia, hora, min, seg, null)){
//Control también entrega mecanismos de envío de excepciones
control.RaiseError(s"Error al abrir archivo: ${this.Error.ControlError_Message}")
}
control.NewStep("Aplicando Filtro")
//Si el archivo no tiene cabecera, comentar la línea de .filter
val rowRDD = this.DataRDD
//filtro para considerar solo las filas que los tres primeros caracteres son numéricos
.filter { x => x.length()>=4 && huemulBigDataGov.isAllDigits(x.substring(0, 3) ) }
//filtro para dejar fuera la primera fila
//.filter { x => x != this.Log.DataFirstRow }
.map { x => this.ConvertSchema(x) }
control.NewStep("Transformando datos a dataframe")
//Crea DataFrame en Data.DataDF
this.DF_from_RAW(rowRDD, Alias)
//****VALIDACION DQ*****
//**********************
control.NewStep("Valida que cantidad de registros esté entre 10 y 100")
//validacion cantidad de filas
val validanumfilas = this.DataFramehuemul.DQ_NumRowsInterval(this, 10, 100)
if (validanumfilas.isError) control.RaiseError(s"user: Numero de Filas fuera del rango. ${validanumfilas.Description}")
control.FinishProcessOK
} catch {
case e: Exception =>
control.Control_Error.GetError(e, this.getClass.getName, null)
control.FinishProcessError()
}
control.Control_Error.IsOK()
}
}
/**
* Este objeto se utiliza solo para probar la lectura del archivo RAW
* La clase que está definida más abajo se utiliza para la lectura.
*/
object raw_entidad_mes_test {
/**
* El proceso main es invocado cuando se ejecuta este código
* Permite probar la configuración del archivo RAW
*/
def main(args : Array[String]) {
//Creación API
val huemulBigDataGov = new huemul_BigDataGovernance(s"Testing DataLake - ${this.getClass.getSimpleName}", args, Global)
//Creación del objeto control, por default no permite ejecuciones en paralelo del mismo objeto (corre en modo SINGLETON)
val Control = new huemul_Control(huemulBigDataGov, null, huemulType_Frequency.MONTHLY )
/*************** PARAMETROS **********************/
val param_ano = huemulBigDataGov.arguments.GetValue("ano", null, "Debe especificar el parámetro año, ej: ano=2017").toInt
val param_mes = huemulBigDataGov.arguments.GetValue("mes", null, "Debe especificar el parámetro mes, ej: mes=12").toInt
//Inicializa clase RAW
val DF_RAW = new raw_entidad_mes(huemulBigDataGov, Control)
if (!DF_RAW.open("DF_RAW", null, param_ano, param_mes, 0, 0, 0, 0)) {
println("************************************************************")
println("********** E R R O R E N P R O C E S O *************")
println("************************************************************")
} else
DF_RAW.DataFramehuemul.DataFrame.show()
Control.FinishProcessOK
huemulBigDataGov.close()
}
}