[Code] cómo encontrar eliminar duplicados en Spark

La respuesta corta es

r = m.reduceByKey(lambda x,y: (x))

Pero consideremos la naturaleza conmutativa y asociativa de la función reduceByKey, asumamos los siguientes valores

  1. A
  2. B
  3. C
  4. E
  5. A
  6. A

Y asumamos que los datos pueden estar en diferentes nodos de un cluster de Hadoop

una posibilidad de ejecución puede ser 1 y 5 y su resultado evaluarlo con 6 para encontrar una sola versión de A

pero también puede suceder que se evalúe 5 y 6 y luego 1 para encontrar una sola versión de A

Esto nos lleva a un dilema en el momento de crear nuestros programas en Spark pq este modelo nos lleva a pensar más allá y resolver los problemas siempre pensando en este paradigma

De otra forma, esta es otra solución (créditos vaerek)

from pyspark.sql import Row
>>> df = sc.parallelize([ \
...     Row(name='Alice', age=5, height=80), \
...     Row(name='Alice', age=5, height=80), \
...     Row(name='Alice', age=10, height=80)]).toDF()
>>> df.dropDuplicates().show()
+---+------+-----+
|age|height| name|
+---+------+-----+
|  5|    80|Alice|
| 10|    80|Alice|
+---+------+-----+

>>> df.dropDuplicates(['name', 'height']).show()
+---+------+-----+
|age|height| name|
+---+------+-----+
|  5|    80|Alice|
+---+------+-----+

Espero sea de ayuda

FREDDY LEANDRO ANGARITA CASTELLANOS
Data platform MVP
@flacMVP

Cómo comparar Nulos en SSIS

Saludos, en SSIS comparar dos columnas en un conditional split que pueden contener valores no es tan simple como usar el operador de igualdad (==) si se intenta eso no se generan errores en tiempo de diseño pero generará errores al momento de ejecutar el paquete dado que la comparación nula con un valor da un resultado desconocido.

Para solventar esta situación analizamos los casos que se pueden presentar al evaluar la condición

Origen Destino
ORIGEN_Columna DESTINO_COLUMNA

Vamos caso por caso

 

Caso Expresión ¿Son iguales?
Las dos columnas son nulas ((ISNULL([ORIGEN_Columna]) && ISNULL([DESTINO_COLUMNA])) ? TRUE Si
Una de las dos columnas es nula ((ISNULL([ORIGEN_Columna]) || ISNULL([DESTINO_COLUMNA])) ? FALSE No
Ninguna es nula, comparar valor ([ORIGEN_Columna] == [DESTINO_COLUMNA]) Sí, si los valores son iguales

La expresión final sería

((ISNULL([ORIGEN_Columna]) && ISNULL([DESTINO_COLUMNA])) ? TRUE : ((ISNULL([ORIGEN_Columna]) || ISNULL([DESTINO_COLUMNA])) ? FALSE : ([ORIGEN_Columna] == [DESTINO_COLUMNA])))

 

Existen otras opciones como REPLACENULL el cuál permite emitir un valor en caso que el primer valor sea NULO, sin embargo considero que la expresión evaluando nulos es más rápida dado que no requiere instanciar un nuevo valor

 

Espero sea de ayuda

FREDDY LEANDRO ANGARITA CASTELLANOS
Data platform MVP
@flacMVP

Listar el nombre de una medida, la carpeta en la que se visualiza y su grupo de medidas

Usar las consultas para extraer información de los cubos es algo que pocas se menciona pero es muy práctico para ahorrar tiempo, especialmente cuando el cubo tiene muchos elementos y buscar uno a uno puede tomar algo de tiempo, incluso, puede usarse para desarrollar soluciones y visualizadores, hoy hablaremos de mdschema_measures la cual retorna información sobre las medidas, la siguiente consulta retorna el nombre del grupo de medidas, la carpeta y el nombre de la medida; La vista proporciona muchos más detalles sobre cada una de las medidas

select DISTINCT MEASUREGROUP_NAME, MEASURE_DISPLAY_FOLDER, MEASURE_NAME from $system.mdschema_measures
WHERE [CUBE_NAME]='NombreCubo' AND MEASURE_NAME = 'NombreMedida'

Espero sea de ayuda

FREDDY LEANDRO ANGARITA CASTELLANOS
Data platform MVP
@flacMVP

[Code] cómo ejecutar n veces el texto seleccionado en SSMS

Hoy escuchando a Eladio Rincon @erincon en una presentación, mostró un truco que quiero compartir por considerarlo muy práctico

Es posible ejectar una instrucción n veces en el Management Studio de una manera muy simple sin necesidad de escribir código para iteraciones solo hay que usar GO n (siendo n el número de veces que quiero ejecutar el bloque seleccionado)

 

Entonces por ejemplo

 

select 1

go 10

 

Presentará 10 veces 1 (lo ejecuta individualmente 10 veces) los invito a probarlo

 

Espero sea de ayuda,

FREDDY LEANDRO ANGARITA CASTELLANOS
Sql Server MVP

 

[Code] Al ejecutar en SSMS es más rápido que al crearlo como procedimiento almacenado

Un caso extraño y que sucede más a menudo de lo esperado es cuando un procedimiento almacenado tarda más en ejecutarse que al hacer el mismo ejercicio en el editor de consultas de SSMS, en este artículo presentaré una técnica aprendida recientemente

 

El tema está con los parámetros: cuando tengo un procedimiento con el siguiente esquema:

create procedure MiProcedimiento
@Valor1 int,
@Valor2 varchar(50),
@valor3 date
as
begin 

............

y dicho procedimiento tarda mucho tiempo y no tarda mucho menos en SSMS sugiero intentar lo siguiente:

create procedure MiProcedimiento
@Valor1 int,
@Valor2 varchar(50),
@valor3 date
as
begin 

declare 
@Valor1Interna int = @Valor1,
@Valor2Interna varchar(50) = @Valor2,
@valor3Interna date =@Valor3

--Cuerpo del procedimiento

End

En mi experiencia he encontrado que al aplicar este truco el rendimiento del procedimiento es el mismo que el encontrado en SSMS, declarar las variables internamente favorece el rendimiento, no es necesario hacerlo en todas las ocaciones, pero resuelve el problema planteado

 

Espero sea de ayuda,

FREDDY LEANDRO ANGARITA CASTELLANOS
Sql Server MVP