Entradas

Mostrando entradas de agosto, 2013

Soluciones SAS Big Data

Cada día toman más relevancia los sistemas “Big Data” y la gestión de los mismos. A continuación recopilo algunos links interesantes sobre las soluciones que SAS ofrece en este tipo de entornos.
Gestión de la información para el big data High-performance analytics para big data High-performance visual analytics Despliegue flexible para el big data

Tratamiento de fechas en SAS (III). Diferencias entre fechas.

Es habitual la necesidad de obtener diferencias entre fechas para realizar validaciones o ejecuciones condicionadas en los procesos. A continuación un sencillo ejemplo que obtiene diferencias entre fechas en diferentes unidades (días, meses, años) y realiza desplazamientos partiendo de una fecha determinada.
Así mismo, un paso data de ejemplo que obtiene todos los días de un mes determinado.

data funciones_f;
length fecha1_num fecha2_num 8.;
fecha1_num = 20121001;
fecha2_num = 20131001;
fecha_h_date = today();
run;




data funciones_f_01(drop = fecha_h_date_suma_1dia fecha_h_date_suma_1mes fecha_h_date_suma_1anyo );
set funciones_f;
/* Transformamos las variables numérica con contenido fecha yyyymmdd a variable tipo fecha */
fecha1_date = mdy((mod((int(fecha1_num/100)),100)),(mod(fecha1_num,100)),(int(fecha1_num/10000)));
fecha2_date = mdy((mod((int(fecha2_num/100)),100)),(mod(fecha2_num,100)),(int(fecha2_num/10000)));
/* Partiendo de una variable tipo fecha que contiene la fecha del día, la conver…

Funciones numéricas básicas

A continuación un sencillo ejemplo, que contiene un  resumen de las funciones numéricas SAS de más uso para realizar las operaciones básicas con números (agregados, medias, valor absoluto, redondeos, etc..).

data funciones_n;
importe1 = 5; importe2 = 4; importe3 = 4; s_importe = -1;output;
importe1 = 6; importe2 = 5; importe3 = 5; s_importe = 3; output;
importe1 = 10; importe2 = 7; importe3 = 6; s_importe = -2; output;
importe1 = 8; importe2 = 4; importe3 = .; s_importe = -1; output;
importe1 = .; importe2 = 0; importe3 = 5; s_importe = 1; output;
run;


data funciones_n_1;
set funciones_n;
c_importe_min = min(importe1, importe2, importe3); /* Valor mínimo */
c_importe_max = max(importe1, importe2, importe3); /* Valor máximo */
c_importe_total = sum(importe1, importe2, importe3); /* Sumatorio importes */
c_importe_total = sum(of importe1-importe3); /* Otra forma de indicar que sume de importe1 a 3 */
c_importe_total = sum(of imp:); /* Suma todos los campos que empiecen por imp: */
c_importe_med_s = (i…

Funciones cadenas de caracteres SAS (II). Búsqueda de caracteres en cadenas

Es habitual en el tratamiento de cadenas la búsqueda de caraceteres o patrones determinados en las cadenas. A continuación un sencillo ejemplo en el que sobre una cadena de texto se realizan determinadas búsquedas. Se muestran también funciones que reemplazan un caracter o patrón por otro.

data funciones_t;
length campo1 $50.;
campo1 = 'Cadena de texto de ejemplo';
run;

data funciones_t_1;
set funciones_t;
campo2 = index(campo1, 'e'); /* Busca el carácter indicado y devuelve la posición que ocupa */
campo3 = indexw(campo1, 'ejemplo'); /* Busca una cadena de caracteres y devuelve la posición */
campo4 = count(campo1, 'e'); /* Devuelve el número de veces que el caracter indicado
                                aparece en la cadena */
campo5 = anyalpha(campo1); /* Busca el primer alfanumérico y devuelve su posición */
campo6 = anydigit(campo1); /* Busca el primer dígito y devuelve su posición */
campo7 = substr(campo1, index(campo1, 't'), 5); /* Busca el caract…

Creación de índices en tablas SAS

En el siguiente ejemplo, mostramos las sentencias necesarias para crear y usar un índice en SAS. Los índices mejoran notablemente el rendimiento en las consultas que utilizan los campos claves del índice. Recordar que, así mismo,  las actualizaciones de datos en la tabla, se ven ralentizadas por la existencia del índice.




/* Creamos la data de ejemplo */



data prueba(drop = i);
do i = 1 to 1000000;
campo1='abc';
campo2=i;
campo3 = round(ranuni(100), 0.01);
output;
end;
run;


/* Con la siguiente sentencia obtenemos información sobre la creación y uso del índice */

options msglevel=i;


/* Creamos un índice por el campo campo3 */

procsql;
create index campo3 on prueba (campo3);
quit;



/* Se puede forzar en un paso data el uso del índice */



dataprueba1;
set prueba (idxwhere=yes); /* forzamos el uso del índice */
where campo3 = 0.5;
run;


/* Borrado del índice */


procsql;
drop index campo3 from prueba;
quit;



Selección de una herramienta ETL

Al abordar un proyecto de Business Intelligence es importante la correcta valoración de la herramienta ETL que vamos a utilizar. SAS proporciona interesantes herramientas ETL como puede ser SAS/Data Integration Studio, pero vamos a realizar un breve análisis sobre los aspectos a valorar en la selección de este tipo de herramientas.
La herramienta ETL será la base para diseñar e implementar los procesos de abastecimiento del Datamart , Datawarehouse o estructura de almacenamiento en base a la cual posteriormente explotaremos los datos. Se trata de una pieza fundamental para el diseño, construcción y posterior evolución de nuestro sistema B.I. Analizaremos únicamente cuestiones técnicas, sin entrar a los aspectos económicos o de otra índole (licencias, acuerdos, soporte técnico, evoluciones de la herramienta, etc..). Señalar que los procesos de ETL, van muy ligados a los procesos de data profiling y de calidad de datos, que aquí no vamos a considerar.
Brevemente y como inicio recordamos q…

Diccionario de SAS: tablas dictionary.tables y dictionary.columns

En ocasiones resulta útil acudir al diccionario de SAS para obtener información
de la estructura de las tablas con las que trabajamos.
A continuación un sencillo ejemplo que accede a las tablas dictionary.tables
y dictionary.columns para obtener todas las tablas y sus columnas contenidas
en una determinada librería

/* Creamos tablas de trabajo: prueba1 y prueba2 */

data prueba1;
var1='a';var2 = 5;
run;

data prueba2;
varc = 'c';varn = 8;
run;



%macro obtener_campos(libreria);

%put Obtenemos tablas y campos de la librería &libreria;

/* Obtenemos todas las tablas contenidas en la librería, las recorremos
con una estructura de control iterativa obteniendo para cada tablas
todas sus columnas */

PROC SQL;
create table tablas as (SELECT memname
FROM dictionary.tables WHERE libname= upcase("&libreria") );
quit;

%let dsid = %sysfunc (open(tablas));    
%let nobs = %sysfunc (attrn(&dsid, NOBS));
%if &nobs > 0 %then %do;
%do i = 1 %to &nobs;     
%let rc = %sysfunc (fetch(…