Si queremos programar en Scala con ventanas podemos usar la plataforma Java. La plataforma Java nos ofrece diferentes opciones en las que tenemos a Swing.
Pero esto nos puede llevar mucho trabajo y tendríamos que llamar desde Scala funciones de java un lió, por ende Scala nos brinda una librería llamada scala-swing
scala-swing nos permite escribir código swing de forma Scala y a la vez nos facilita muchísimo este trabajo.
Veamos un ejemplo:
Programamos un archivo llamado: Ventana.scala
package com.assembly
import scala.swing._
import scala.swing.event._
object Ventana extends SimpleSwingApplication {
def top = new MainFrame {
title = "SwingApp"
var numclicks = 0
object label extends Label {
val prefix = "Tocaste el boton : "
text = prefix + "0 "
listenTo(button)
reactions += {
case ButtonClicked(button) =>
numclicks = numclicks + 1
text = prefix + numclicks
}
}
object button extends Button {
text = "Soy El buton"
}
contents = new FlowPanel {
contents.append(button, label)
border = Swing.EmptyBorder(5, 5, 5, 5)
}
}
}
Para llamar esta clase podemos utilizar un Objeto, llamado Main :
package com.assembly
object Main {
def main(args: Array[String]): Unit = {
val ventana = Ventana
ventana.startup(args)
}
}
Y Listo!!
Dejo link: https://github.com/scala/scala-swing
Translate
sábado, 21 de abril de 2018
martes, 17 de abril de 2018
Lenguajes que compilan para Python
Quiero compartir un link sobre un lenguajes que son compatibles con python o que pueden correr sobre la plataforma.
Lo interesante del link es la cantidad de lenguajes funcionales.
Y otra cosa interesante es que se puede bajar el libro: "Functional Programming in Python"
Dejo link:
https://github.com/vindarel/languages-that-compile-to-python
https://github.com/sfermigier/awesome-functional-python
domingo, 15 de abril de 2018
Ejemplo de una aplicación en Spark
La aplicación de muestra en esta sección es una aplicación simple para contar palabras. Este es el mismo ejemplo que se utiliza para enseñar el procesamiento de big data con Hadoop. Realizaremos algunos análisis de datos en un archivo de texto para contar cuántas palabras hay en el archivo y cuántas veces se repiten. El archivo de texto y el conjunto de datos en este ejemplo son pequeños, pero los mismos programas Spark se pueden usar para grandes conjuntos de datos sin modificaciones de código. De forma similar a Hadoop, el entorno de tiempo de ejecución Spark distribuirá automáticamente los datos a diferentes nodos en el clúster para un procesamiento de datos más rápido.
Para mantener el ejemplo simple, usaremos el shell Spark Scala.
Primero, instalemos Spark en nuestra máquina local, esto ya lo vimos en post pasados.
Con spark instalado y listo, podemos utilizar el API de stark para procesar archivos. Por lo tanto abrimos el shell de scala (yo voy a utilizar linux)
Me paro en la carpeta bin de spark y escribo:
$ ./spark-shell
Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
18/04/15 11:04:39 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
18/04/15 11:04:39 WARN Utils: Your hostname, toto resolves to a loopback address: 127.0.1.1; using 172.17.0.1 instead (on interface docker0)
18/04/15 11:04:39 WARN Utils: Set SPARK_LOCAL_IP if you need to bind to another address
Spark context Web UI available at http://172.17.0.1:4040
Spark context available as 'sc' (master = local[*], app id = local-1523801082307).
Spark session available as 'spark'.
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 2.2.1
/_/
Using Scala version 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_161)
Type in expressions to have them evaluated.
Type :help for more information.
scala> import org.apache.spark.SparkContext
import org.apache.spark.SparkContext
scala> import org.apache.spark.SparkContext._
import org.apache.spark.SparkContext._
scala> val txtFile = "../NOTICE"
txtFile: String = ../NOTICE
scala> val txtData = sc.textFile(txtFile)
txtData: org.apache.spark.rdd.RDD[String] = ../NOTICE MapPartitionsRDD[1] at textFile at <console>:30
scala> txtData.cache()
res2: txtData.type = ../NOTICE MapPartitionsRDD[1] at textFile at <console>:30
scala> txtData.count()
res3: Long = 661
De esta manera sabemos la cantidad de lineas de archivo “NOTICE”, si queremos saber la cantidad de veces que aparece las palabras podemos hacer:
scala> val wcData = txtData.flatMap(l => l.split(" ")).map(word => (word, 1)).reduceByKey(_ + _)
wcData: org.apache.spark.rdd.RDD[(String, Int)] = ShuffledRDD[6] at reduceByKey at <console>:36
scala> wcData.collect().foreach(println)
(created,1)
(Unless,4)
(Technology,1)
(Sébastien,1)
...
Lo que hace en la
primera linea es :
- Divide una linea por espacio “ ”
- Luego crea una tupla (palabra, 1), imaginate que queda algo así: (palabra1,1) , (palabra2,1), (palabra1,1), (palabra1,1)
- Por lo tanto aplica una reducción por key es decir va sumando cuantas veces aparecen las palabras agrupándolos por key y queda de la siguiente manera: (palabra1,3) , (palabra2,1)
En la segunda linea
imprimirme el resultado.
Y Listo!!
viernes, 13 de abril de 2018
Estadísticas de las base de datos relacionales.
Para que una base de datos relacional pueda resolver una consulta SQL de forma óptima necesita conocer los datos físicos de cada tabla, índice o cluster que intervienen en ella. Estos datos se almacenan en el diccionario de datos.
En oracle pueden ser consultadas usando las vistas adecuadas: dba_tables, dba_tab_statistics, dba_tab_col_statistics, dba_tab_histograms, dba_indexes, dba_ind_statistics… etc.
En concreto, es el optimizador quién de todos los planes de ejecución posibles analiza estos datos estadísticos para evaluar cuál de todos supone un menor coste en términos de I/O y uso de CPU.
Las estadísticas deben reflejar verazmente el estado físico de los objetos, y conforme vayan sufriendo transformaciones éstas se irán quedando obsoletas. Es por esto por lo que hay que recopilar las estadísticas de nuevo a medida que ya no reflejen la situación real de los objetos a los que describen.
Si una tabla no posee estadísticas, el motor de base de datos puede recopilar ciertos datos dinámicamente en el momento de la consulta. Esto se llama muestreo dinámico “dynamic sampling”.
Las estadísticas se pueden recopilar manual o automáticamente. Por omisión, Oracle recopila las estadísticas a través del job programado con scheduler en una ventana de tiempo predefinida: por ejemplo de lunes a viernes de 22:00 a 6:00 y sábados y domingos completos. Durante esta recopilación automática se toman datos de tablas sin estadísticas o con estadísticas obsoletas (que han sufrido más de 10% de modificaciones desde la anterior toma de datos) pero antes debe haberse configurado el parámetro STATISTICS_LEVEL a un valor distinto de BASIC.
En oracle para seguir el número de registros modificados existe la vista existe all_tab_modifications. Ésta muestra el número aproximado de inserciones, modificaciones, borrados y truncados que ha sufrido la tabla desde la última recopilación. La vista es consultable por el usuario pero hay que tener en cuenta que estos datos no son visibles inmediatamente. Existe un retardo de unos minutos para evitar que la escritura interfiera en el rendimiento.
Para recopilar las estadísticas manualmente hay diferentes funciones dependiendo el motor por ejemplo en oracle hay que usar el paquete DBMS_STATS. Dicho paquete tiene métodos para:
En Oracle podemos ejecutar las estadísticas para todos los esquemas de la siguiente forma:
SQL> exec dbms_stats.gather_database_stats;
Procedimiento PL/SQL terminado correctamente.
En Postgres por ejemplo existe una herramienta llamada ANALYZE que permite correr las estadísticas de forma manual :
ANALYZE [ VERBOSE ] [ table_name [ ( column_name [, ...] ) ] ]
Como se puede ver hay diferentes modos de correr esto pero lo más común sería:
ANALYZE VERBOSE users;
En sql server, tambien podemos actualizar las estadísticas utilizando UPDATE STATISTICS o el stored procedure sp_updatestats, veamos unos ejemplos:
USE AdventureWorks2012;
GO
UPDATE STATISTICS Sales.SalesOrderDetail;
GO
La actualización de estadísticas garantiza que las consultas compilan con estadísticas actualizadas. Sin embargo, actualizar las estadísticas hace que las consultas se recompilen. Por lo tanto puede haber una compensación de rendimiento entre la mejora de los planes de consulta y el tiempo que lleva recompilar las consultas.
Y por ultimo, algo muy importante es hacer backup tambien de las estadísticas, dado que si pasa algo con la base de datos, no solo vamos a querer restaurarla sino tambien que sea usable. Por lo tanto a la hora de hacer backup incluyamos las estadísticas.
En oracle pueden ser consultadas usando las vistas adecuadas: dba_tables, dba_tab_statistics, dba_tab_col_statistics, dba_tab_histograms, dba_indexes, dba_ind_statistics… etc.
En concreto, es el optimizador quién de todos los planes de ejecución posibles analiza estos datos estadísticos para evaluar cuál de todos supone un menor coste en términos de I/O y uso de CPU.
Las estadísticas deben reflejar verazmente el estado físico de los objetos, y conforme vayan sufriendo transformaciones éstas se irán quedando obsoletas. Es por esto por lo que hay que recopilar las estadísticas de nuevo a medida que ya no reflejen la situación real de los objetos a los que describen.
Si una tabla no posee estadísticas, el motor de base de datos puede recopilar ciertos datos dinámicamente en el momento de la consulta. Esto se llama muestreo dinámico “dynamic sampling”.
Las estadísticas se pueden recopilar manual o automáticamente. Por omisión, Oracle recopila las estadísticas a través del job programado con scheduler en una ventana de tiempo predefinida: por ejemplo de lunes a viernes de 22:00 a 6:00 y sábados y domingos completos. Durante esta recopilación automática se toman datos de tablas sin estadísticas o con estadísticas obsoletas (que han sufrido más de 10% de modificaciones desde la anterior toma de datos) pero antes debe haberse configurado el parámetro STATISTICS_LEVEL a un valor distinto de BASIC.
En oracle para seguir el número de registros modificados existe la vista existe all_tab_modifications. Ésta muestra el número aproximado de inserciones, modificaciones, borrados y truncados que ha sufrido la tabla desde la última recopilación. La vista es consultable por el usuario pero hay que tener en cuenta que estos datos no son visibles inmediatamente. Existe un retardo de unos minutos para evitar que la escritura interfiera en el rendimiento.
Para recopilar las estadísticas manualmente hay diferentes funciones dependiendo el motor por ejemplo en oracle hay que usar el paquete DBMS_STATS. Dicho paquete tiene métodos para:
- Recopilar estadísticas.
- Borrar estadísticas.
- Guardar y asignar estadísticas.
- Crear o borrar tablas donde guardar juegos de estadísticas.
- Bloquear y desbloquear las estadísticas de las tablas.
- Retornar las estadísticas que tenía una tabla en un momento dado.
En Oracle podemos ejecutar las estadísticas para todos los esquemas de la siguiente forma:
SQL> exec dbms_stats.gather_database_stats;
Procedimiento PL/SQL terminado correctamente.
En Postgres por ejemplo existe una herramienta llamada ANALYZE que permite correr las estadísticas de forma manual :
ANALYZE [ VERBOSE ] [ table_name [ ( column_name [, ...] ) ] ]
Como se puede ver hay diferentes modos de correr esto pero lo más común sería:
ANALYZE VERBOSE users;
En sql server, tambien podemos actualizar las estadísticas utilizando UPDATE STATISTICS o el stored procedure sp_updatestats, veamos unos ejemplos:
USE AdventureWorks2012;
GO
UPDATE STATISTICS Sales.SalesOrderDetail;
GO
La actualización de estadísticas garantiza que las consultas compilan con estadísticas actualizadas. Sin embargo, actualizar las estadísticas hace que las consultas se recompilen. Por lo tanto puede haber una compensación de rendimiento entre la mejora de los planes de consulta y el tiempo que lleva recompilar las consultas.
Y por ultimo, algo muy importante es hacer backup tambien de las estadísticas, dado que si pasa algo con la base de datos, no solo vamos a querer restaurarla sino tambien que sea usable. Por lo tanto a la hora de hacer backup incluyamos las estadísticas.
jueves, 12 de abril de 2018
Y si , ya se esta hablando de Java 11...
Java 10 no pudo traer otra cosa que los rumores de lo que se viene en java 11.
Primera noticia es que CORBA, Java EE, and JavaFX, ya no tendrán soporte en esta versión. Java 11 también está configurado para perder algunas capacidades mediante la eliminación de los módulos CORBA y Java EE (recientemente renombrado Jakarta EE), así como la eliminación de JavaFX.
Y las nuevas características planificadas incluyen:
- Epsilon como Java garbage collector , Epsilon manejará la asignación de memoria sin implementar ningún mecanismo de recuperación de memoria.
- Una nueva sintaxis de variable local para parámetros lambda, dado que se debe alinear la sintaxis de una declaración de parámetro formal en una expresión implícitamente tipada con la sintaxis de una declaración de variable local. Esto permitiría usar var cuando se declaran parámetros formales de una expresión lambda implícitamente tipada.
- El formato de archivo de clase Java se ampliará para soportar un nuevo de grupo constantes, CONSTANT_Dynamic. El objetivo es reducir el costo y la interrupción del desarrollo de nuevas formas de restricciones de archivos de clase materializables.
Como conclusión podemos afirmar que no va ha ver ningún gran cambio en Java 11, solo unos cambios que permitirán mejorar el desempeño del ecosistema java.
Dejo link:
https://www.javaworld.com/article/3266372/core-java/java-11-roadmap-the-new-features-you-can-expect.html
miércoles, 11 de abril de 2018
Tipo de Variables compartidas en Spark
Spark provee 2 tipos de variables compartidas para hacer más eficiente correr spark en un cluster. Hay variables broadcasts y accumutators.
La variable
broadcasts, permite a los desarrolladores tener las variables de solo
lectura almacenadas en caché en cada máquina en local. Se pueden
usar para dar más eficientemente copias de conjuntos de datos de
entrada grande a los nodos en el clúster.
Variable accumutators, usan una operación asociativa y, por lo tanto, pueden
ser soportados de manera eficiente en paralelo. Se pueden usar para
implementar contadores (como en MapReduce) o sumas. Las tareas que se
ejecutan en el clúster pueden agregarse a una variable de acumulador
mediante el método de agregar. Sin embargo, no pueden leer su valor.
Solo el programa del controlador puede leer el valor del acumulador.
martes, 10 de abril de 2018
Entendiendo EXPLAIN PLAN de Oracle
Dado que SQL es un lenguaje declarativo, nosotros no le decimos como hacer las cosas, solo le decimos que hacer. Por lo tanto el motor de base de datos, decide que camino tomar.
Si tenemos un problema de performace en alguna consulta, lo que podemos hacer es pedirle a oracle que nos explique que esta haciendo, y de esta manera ver si le falta un indice o si la podemos ayudar.
La instrucción EXPLAIN PLAN muestra los planes de ejecución elegidos por el optimizador de Oracle para las instrucciones SELECT, UPDATE, INSERT y DELETE. El plan de ejecución de una declaración es la secuencia de operaciones que Oracle realiza para ejecutar la instrucción.
Muestra la siguiente información:
- Un orden de las tablas a las que hace referencia la consulta o update
- Un método de acceso para cada tabla mencionada en la consulta o update
- Un método de combinación para tablas afectadas por operaciones de combinación de la instrucción.
- Operaciones de datos como filtro, clasificación o agregación
- Optimización, como el costo y la cardinalidad de cada operación
- Particionamiento, como el conjunto de particiones accedidas
- Ejecución paralela
Para ejecutar el EXPLAIN PLAN debemos ejecutar por ejemplo esta query:
EXPLAIN PLAN FOR SELECT last_name FROM employees;
En este caso se escribio el plan de ejecución en una vista por lo que si queremos verlo, podemos hacer:
SELECT PLAN_TABLE_OUTPUT FROM TABLE(DBMS_XPLAN.DISPLAY());
Luego podemos escribir otros post que nos enseñen como entender los query plans. Pero eso es todo por ahora.
sábado, 7 de abril de 2018
Problema de database locking usando hibernate
Tuve un problema de database locking (loqueo en una búsqueda de castellanización) en la aplicación que estoy trabajando, el tema era que nadie debería escribir en la tabla que se loqueaba.
Lo primero que hice es ver el log de hibernate y pedirle que me muestre el sql, eso se logra cambiando el parámetro "show_sql". Analizando los sql, cuando se consultaba esta entidad hibernate hacia unos update y deletes que eran rarísimos, porque solo era una consulta. Es decir no debía hacer eso.
Luego de un analisis del codigo de consulta no encontre nada raro... Por lo tanto me puse a ver el mapeo y tampoco, nada raro...
Luego de caer en un pozo depresivo, vi la luz. Al parecer esta entidad estaba contenida por otra entidad, la cual en el método get ordenaba la lista. Parece ilógico, pero no lo es.
Cuando se hacia un get de esta lista, la aplicación ordenaba la lista y hibernate asumia que esta lista había cambiado, claro el no sabe que ya se había guardado ordenada. Por lo tanto cada vez que se hacia un get, hibernate removía la lista vieja y guardaba una nueva, sin importar si había cambios o no.
No se si esto se arreglo en futuras versiones de hibernate, pero como linea general traten siempre que usen hibernate que los métodos get no hagan nada (solo lo que deben hacer, retornar el valor)
Como lo solucione? muy fácil, hice un método get que no ordenaba, es decir el típico get y hice otro método getSorted que lo use en mi código. Y listo!
Espero que les sirva.
Lo primero que hice es ver el log de hibernate y pedirle que me muestre el sql, eso se logra cambiando el parámetro "show_sql". Analizando los sql, cuando se consultaba esta entidad hibernate hacia unos update y deletes que eran rarísimos, porque solo era una consulta. Es decir no debía hacer eso.
Luego de un analisis del codigo de consulta no encontre nada raro... Por lo tanto me puse a ver el mapeo y tampoco, nada raro...
Luego de caer en un pozo depresivo, vi la luz. Al parecer esta entidad estaba contenida por otra entidad, la cual en el método get ordenaba la lista. Parece ilógico, pero no lo es.
Cuando se hacia un get de esta lista, la aplicación ordenaba la lista y hibernate asumia que esta lista había cambiado, claro el no sabe que ya se había guardado ordenada. Por lo tanto cada vez que se hacia un get, hibernate removía la lista vieja y guardaba una nueva, sin importar si había cambios o no.
No se si esto se arreglo en futuras versiones de hibernate, pero como linea general traten siempre que usen hibernate que los métodos get no hagan nada (solo lo que deben hacer, retornar el valor)
Como lo solucione? muy fácil, hice un método get que no ordenaba, es decir el típico get y hice otro método getSorted que lo use en mi código. Y listo!
Espero que les sirva.
viernes, 6 de abril de 2018
Libros gratuitos
Me llegaron ests libros de java geeks :
miércoles, 4 de abril de 2018
Spark web console
Cuando corres spark
en cualquier modo, se pueden ver los jobs y otras estadísticas en la
consola web que se encuentra en : localhost:4040
Esta consola tiene
los siguientes tabs: Jobs, Stages, Storage, Environment y Executors.
lunes, 2 de abril de 2018
Ur, un lenguaje funcional puro
Ur es un lenguaje de programación similar a ML y Haskell, pero presenta un sistema de tipos significativamente más rico. Ur es funcional puro, estáticamente tipado y estricto. Ur soporta metaprogramación basada en el sitema de row types.
Ur/Web es Ur más una biblioteca estándar especial y reglas asociadas para el análisis sintáctico y la optimización web. Ur/Web admite la construcción de aplicaciones web dinámicas respaldadas por bases de datos SQL. Ur/Web utiliza el tipado estatioco de tal manera que las paginas generadas no pueden :
Este tipo de seguridad es solo la base de la metodología Ur/Web. También es posible usar la metaprogramación para construir piezas de aplicación significativas mediante el análisis de la estructura de tipos. Por ejemplo, la demostración incluye un functor estilo ML para construir una interfaz de administración para una tabla SQL arbitraria. El sistema de tipo garantiza que la sub-aplicación de interfaz siempre estará libre de los errores mencionados anteriormente, sin importar qué descripción de tabla bien tipada.
El compilador de Ur/Web también produce código de objeto muy eficiente que no utiliza la recolección de elementos no utilizados. Estos programas compilados a menudo serán incluso más eficientes de lo que la mayoría de los programadores se tomarían la molestia de escribir en C. Por ejemplo, el servidor web independiente generado para la demostración utiliza menos memoria RAM que el shell bash. El compilador también genera versiones JavaScript del código del lado del cliente, sin necesidad de escribir esas partes de las aplicaciones en un lenguaje diferente.
Y como esto furra poco la implementación de todo esto es de código abierto.
Dejo link: http://www.impredicative.com/ur/
Ur/Web es Ur más una biblioteca estándar especial y reglas asociadas para el análisis sintáctico y la optimización web. Ur/Web admite la construcción de aplicaciones web dinámicas respaldadas por bases de datos SQL. Ur/Web utiliza el tipado estatioco de tal manera que las paginas generadas no pueden :
- Sufrir cualquier tipo de ataque de inyección de código
- Retornar HTML no válido
- Contiener enlaces muertos o invalidos dentro de la aplicación
- Tener desajustes entre formularios HTML y los campos esperados por sus controladores
- Incluir el código del lado del cliente que hace suposiciones incorrectas sobre los servicios de estilo "AJAX" que proporciona el servidor web remoto
- Intentar consultas SQL no válidas
- Usar referencias o bases de datos impropias en la comunicación con bases de datos SQL o entre navegadores y servidores web
Este tipo de seguridad es solo la base de la metodología Ur/Web. También es posible usar la metaprogramación para construir piezas de aplicación significativas mediante el análisis de la estructura de tipos. Por ejemplo, la demostración incluye un functor estilo ML para construir una interfaz de administración para una tabla SQL arbitraria. El sistema de tipo garantiza que la sub-aplicación de interfaz siempre estará libre de los errores mencionados anteriormente, sin importar qué descripción de tabla bien tipada.
El compilador de Ur/Web también produce código de objeto muy eficiente que no utiliza la recolección de elementos no utilizados. Estos programas compilados a menudo serán incluso más eficientes de lo que la mayoría de los programadores se tomarían la molestia de escribir en C. Por ejemplo, el servidor web independiente generado para la demostración utiliza menos memoria RAM que el shell bash. El compilador también genera versiones JavaScript del código del lado del cliente, sin necesidad de escribir esas partes de las aplicaciones en un lenguaje diferente.
Y como esto furra poco la implementación de todo esto es de código abierto.
Dejo link: http://www.impredicative.com/ur/
jueves, 29 de marzo de 2018
Como instalar y correr Apache Spark?
Hay varias formas diferentes de instalar y usar Spark. Podemos instalarlo en una máquina como una aplicación stand-alone o usar una de las imágenes de máquinas virtuales Spark disponibles de proveedores como Cloudera, Hortonworks o MapR. También podemos usar Spark instalado y configurado en la nube (por ejemplo, en Databricks Community Edition).
Cuando instalamos Spark en una máquina local o usamos una instalación basada en la nube, podemos usar algunos modos diferentes para conectarnos al motor Spark.
La siguiente tabla muestra los parámetros principales de URL para los diferentes modos de ejecutar Spark:
- Local: Corre Spark de forma local con un worker
- local[k]: Corre Spark de forma local con k workers (lo ideal es que k sea numero de micros)
- local[*]: Corre Spark de forma local y corre con un numero de workers que se asigna de forma lógica.
- spark://HOST:PORT: Conecta con un spark standalone cluster master. El puerto debe ser cualquiera que haya sido configurado en el master. Por defecto es 7077.
- meso://HOST:PORT: Conecta con un Mesos cluster. E El puerto debe ser cualquiera que haya sido configurado en el master. Por defecto es 5050.
- yarn-client: conecta con clusters YARD en modo cliente, la ubicación del clúster se encontrará en función de la variable HADOOP_CONF_DIR.
- yarn-cluster: conecta con clusters YARD en modo cluster, la ubicación del clúster se encontrará en función de la variable HADOOP_CONF_DIR.
Una vez que Spark este funcionando, nosotros podemos connectar usando Spark shell para analisis interactivo de datos. El shell Spark está disponible en los lenguajes Scala y Python. Java no era compatible con un shell interactivo anteriormente, pero está disponible en JDK 9. La herramienta REPL (read-eval-print loop) en Java se llama Jshell.
Se puede utilizar spark-shell para Scala y pyspark para Python.
sábado, 24 de marzo de 2018
Java 10 fue liberado
Si! vamos por java 10, oracle tomo el control de java y no para de sacar versiones. Esta versión fue 6 meses despues de java 9.
El lanzamiento de Java 10 vuelve obsoleto a Java 9 y no se ofrecerán más versiones gratuitas de Java 9. A partir del 20 de marzo, las únicas versiones de Java con soporte gratuito de Oracle son Java 8 y Java 10. La próxima versión con soporte a largo plazo disponible va ser Java 11, que se lanzará en septiembre de 2018.
La versión final prácticamente no ha cambiado desde el candidato RC1 y no se han agregado características significativas.
La documentación completa de esta versión está disponible, así como el release note.
Entre las características más importantes se encuentra la palabra "var" que permite la inferencia de tipos:
var foo = new ArrayList<String>();
Además de los casos simples, esto realmente permite construcciones de programación que no eran posibles antes:
public class Test {
public static void main(String[] args) {
(new Object() {
public void bar() {
System.out.println("bar!");
}
}).bar();
}
}
Y gracias a la palabra var y la inferencia de tipos podemos hacer lo siguiente:
var o = new Object() {
public void bar() {
System.out.println("bar!");
}
};
o.bar();
Todavia tengo post sobre java 8 y 9 y oracle lanza Java 10!! En un futuro no muy lejano seguiré escribiendo sobre las nuevas características de java 10.
Dejo link: http://jdk.java.net/10/
https://docs.oracle.com/javase/10/
¿Cómo logra una empresa argentina figurar entre las mejores 100 compañías de outsourcing del mundo?
Como sabrán algunos trabajo en una empresa que se llama hexacta. Esta empresa se encuentra entre las mejores 100 compañías de outsourcing del mundo dado esto la revista digital insider hizo el siguiente reportaje a un socio de hexacta:
http://insiderlatam.com/como-logra-una-empresa-argentina-figurar-entre-las-mejores-100-companias-de-outsourcing-del-mundo
http://insiderlatam.com/como-logra-una-empresa-argentina-figurar-entre-las-mejores-100-companias-de-outsourcing-del-mundo
miércoles, 21 de marzo de 2018
Conjuntos de datos distribuidos resistentes en Spark
Conjuntos de datos distribuidos resistentes o Resilient distributed datasets (RDD) esta basado en Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing” (Matei et al 2012) este es el concepto base de Apache Spark.
RDD es como una tabla en una base de datos, la cual puede guardar datos de cualquier tipo. Spark guarda datos en RDD en diferentes particiones.
RDD ayudan a reorganizar los cálculos y a optimizar el procesamiento de datos. También son tolerantes a fallas porque el RDD sabe cómo recrear y volver a calcular los conjuntos de datos.
RDDs son inmutables (podemos ver la programación funcional de scala en este aspecto). Es decir se puede procesar un RDD pero esto retornara un nuevo RDD con el resultado de la transformación.
RDD soporta 2 tipos de acciones:
- Transformaciones: esto no retorna un valor pero retorna un nuevo RDD. Algunas funciones de transformación: map , filter , flatMap , groupByKey , reduceByKey , aggregateByKey , pipe y coalesce.
- Acciones: operaciones que retornan un valor. Cuando una acción es llamada los datos son procesados y un valor es retornado. Algunas funciones de acción: reduce , collect , count , first , take , countByKey y foreach.
Suscribirse a:
Entradas (Atom)