[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

[Codigo] En SSIS error extraño al generar código

En algunos casos se quiere generar una consulta dentro SSIS para ser ejecutada por una tarea posterior (o generar cualquier texto en general), normalmente se usa algo como una tarea SQL para realizar dicho trabajo, la consulta sería algo así

declare @Consulta nvarchar(max) 

SET @Consulta = 'select ''A'''

select @Consulta

Creamos una tarea SQL con la siguiente configuración

 

 ResultSet: Single Row SQL Statement: declare @Consulta nvarchar(100) SET @Consulta = 'select ''A''' select @Consulta
Configuración

 

 

ResultaName: 0 y en Variable Name: User::Resultado
Configuración Tarea2

 

 

 

Se asume:

  • Se creó la variable con nombre Resultado de tipo String
  • Se tiene una conexión OLEDB hacia Sql Server

Al ejecutar el paquete se encuentra el siguiente mensaje de error

[Execute SQL Task] Error: An error occurred while assigning a value to variable "Resultado": "The type of the value (DBNull) being assigned to variable "User::Resultado" differs from the current variable type (String). Variables may not change type during execution. Variable types are strict, except for variables of type Object.
".

Se puede pasar un tiempo importante buscando la causa del error y al ejecutar la consulta la misma retorna el resultado esperado al ejecutarla en el SSMS

El problema es el manejo de SSIS tiene de los tipos de datos varchar(max), nvarchar(max), si el código se cambia por

declare @Consulta nvarchar(100) 

SET @Consulta = 'select ''A'''

select @Consulta

Y se ejecuta de nuevo, el error desaparece

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

 

[How to] Ver la fecha de creación y modificación de los procedimientos almacenados

Saludos, algunas veces, para hacer control de cambios es necesario cuando modificamos un procedimiento almacenado, para hacerlo, se puede usar la siguiente instrucción

 

SELECT name, create_date, modify_date 

FROM sys.objects

WHERE type = ‘P’ 

order by modify_date desc

 

Espero sea de ayuda,

FREDDY LEANDO ANGARITA CASTELLANOS
Sql Server MVP

 

 

[Code] Cómo convertir un archivo DataCollector .blg a CSV

Saludos

Al hacer dianóstico de Sql Server (y de cualquier otro sistema que implemente correctamente instrumentación) se recurre a los data collectors para diagnosticas nuestro sistema, los archivos que dicha operación generan tienen la extensión .blg, los cuales al intentar analizarlos nos encontramos con un problema, dado que son archivos binarios, para convertirlos a CSV se puede usar la herramienta RELOG, la documentación se puede encontrar aquí

Un ejemplo:

relog -f csv MiArchivo.blg -o MiArchivoSalida.csv

 

Espero sea de ayuda,

FREDDY LEANDO ANGARITA CASTELLANOS
Sql Server MVP

 

 

[Code] Cómo obtener el valor que retorna un procedimiento almacenado al usar sp_executesql

Saludos, al revisar la documentación oficial de sp_executesql observo que no se presenta la forma de obtener el valor devuelto por un procedimiento almacenado, aquí un ejemplo:

create procedure MiProcedimiento
as
Begin
return 2 --Valor arbitrario
End


declare @script nvarchar(4000)
declare @filasAfectadas int = 0

set @script = 'exec @filasAfectadas = MiProcedimiento'
exec sp_executesql @script, N'@filasAfectadas int output', @filasAfectadas=@filasAfectadas output

print @filasAfectadas 

Al ejecutar el script de ejemplo observamos que se obtiene el resultado del valor devuelto por el procedimiento, la parte clave es pasar una variable marcada con output para tener el resultado

 

 

Espero sea de ayuda,

FREDDY LEANDO ANGARITA CASTELLANOS
Sql Server MVP