Me pregunto cuál es la diferencia entre an RDD
y DataFrame
(Spark 2.0.0 DataFrame es un simple alias de tipo para Dataset[Row]
) en Apache Spark.
¿Puedes convertir uno a otro?
fuente
Me pregunto cuál es la diferencia entre an RDD
y DataFrame
(Spark 2.0.0 DataFrame es un simple alias de tipo para Dataset[Row]
) en Apache Spark.
¿Puedes convertir uno a otro?
A DataFrame
se define bien con una búsqueda en Google de "definición de marco de datos":
Un marco de datos es una tabla, o estructura tipo matriz bidimensional, en la que cada columna contiene medidas en una variable, y cada fila contiene un caso.
Entonces, a DataFrame
tiene metadatos adicionales debido a su formato tabular, que permite a Spark ejecutar ciertas optimizaciones en la consulta finalizada.
Una RDD
, por otra parte, es simplemente un R esilient D istributed D ataset que es más de un blackbox de datos que no pueden ser optimizados como las operaciones que se pueden realizar en contra de ella, no son tan limitados.
Sin embargo, puede pasar de un DataFrame a una RDD
vía su rdd
método, y puede pasar de una RDD
a una DataFrame
(si el RDD está en formato tabular) a través del toDF
método
En general , se recomienda utilizar un DataFrame
cuando sea posible debido a la optimización de consulta incorporada.
Sí ... la conversión entre
Dataframe
yRDD
es absolutamente posible.A continuación hay algunos fragmentos de código de muestra.
df.rdd
esRDD[Row]
A continuación se presentan algunas opciones para crear un marco de datos.
1)
yourrddOffrow.toDF
convierte aDataFrame
.2) Uso
createDataFrame
del contexto sqlval df = spark.createDataFrame(rddOfRow, schema)
De hecho, ahora hay 3 API de Apache Spark.
RDD
API:Ejemplo de RDD:
Ejemplo: filtro por atributo con RDD
DataFrame
APIEjemplo de estilo SQL:
df.filter("age > 21");
Limitaciones: Debido a que el código se refiere a los atributos de datos por nombre, el compilador no puede detectar ningún error. Si los nombres de los atributos son incorrectos, el error solo se detectará en tiempo de ejecución, cuando se crea el plan de consulta.
Otra desventaja de la
DataFrame
API es que está muy centrada en la escala y, aunque admite Java, la compatibilidad es limitada.Por ejemplo, al crear
DataFrame
un objeto existenteRDD
de Java, el optimizador Catalyst de Spark no puede inferir el esquema y supone que cualquier objeto en el DataFrame implementa lascala.Product
interfaz. Scalacase class
funciona de la caja porque implementan esta interfaz.Dataset
APIEjemplo de
Dataset
estilo SQL API:Las evaluaciones dif. entre
DataFrame
&DataSet
:Flujo a nivel catalista. (Desmitificación de la presentación de DataFrame y Dataset de la cumbre de chispas)
Lecturas adicionales ... artículo de databricks - Un cuento de tres API de Apache Spark: RDD vs DataFrames y Datasets
fuente
df.filter("age > 21");
esto puede evaluarse / analizarse solo en tiempo de ejecución. desde su cadena. En caso de conjuntos de datos, los conjuntos de datos son compatibles con Beans. entonces la edad es propiedad del frijol. Si la propiedad age no está en tu bean, entonces llegarás a saber temprano en el tiempo de compilación (iedataset.filter(_.age < 21);
). El error de análisis puede renombrarse como Errores de evaluación.Apache Spark proporciona tres tipos de API
Aquí está la comparación de API entre RDD, Dataframe y Dataset.
RDD
Características del RDD: -
Colección distribuida:
RDD utiliza operaciones MapReduce, que es ampliamente adoptada para procesar y generar grandes conjuntos de datos con un algoritmo paralelo y distribuido en un clúster. Permite a los usuarios escribir cálculos paralelos, utilizando un conjunto de operadores de alto nivel, sin tener que preocuparse por la distribución del trabajo y la tolerancia a fallas.
Inmutable: RDDs compuestos de una colección de registros que están particionados. Una partición es una unidad básica de paralelismo en un RDD, y cada partición es una división lógica de datos que es inmutable y creada a través de algunas transformaciones en particiones existentes. La inmutabilidad ayuda a lograr consistencia en los cálculos.
Tolerante a fallas: en el caso de que perdamos parte de RDD, podemos reproducir la transformación en esa partición en linaje para lograr el mismo cálculo, en lugar de hacer la replicación de datos en múltiples nodos. Esta característica es el mayor beneficio de RDD porque ahorra muchos esfuerzos en la gestión y replicación de datos y, por lo tanto, logra cálculos más rápidos.
Evaluaciones diferidas : todas las transformaciones en Spark son diferidas, ya que no calculan sus resultados de inmediato. En cambio, solo recuerdan las transformaciones aplicadas a algún conjunto de datos base. Las transformaciones solo se calculan cuando una acción requiere que se devuelva un resultado al programa del controlador.
Transformaciones funcionales: los RDD admiten dos tipos de operaciones: transformaciones, que crean un nuevo conjunto de datos a partir de una existente, y acciones, que devuelven un valor al programa del controlador después de ejecutar un cálculo en el conjunto de datos.
Formatos de procesamiento de datos:
puede procesar de manera fácil y eficiente los datos estructurados y no estructurados.
Lenguajes de programación compatibles: la
API RDD está disponible en Java, Scala, Python y R.
Limitaciones de RDD: -
Sin motor de optimización incorporado: cuando se trabaja con datos estructurados, los RDD no pueden aprovechar las ventajas de los optimizadores avanzados de Spark, incluido el optimizador de catalizador y el motor de ejecución de tungsteno. Los desarrolladores deben optimizar cada RDD en función de sus atributos.
Manejo de datos estructurados: a diferencia del Dataframe y los conjuntos de datos, los RDD no infieren el esquema de los datos ingeridos y requieren que el usuario los especifique.
Marcos de datos
Spark introdujo Dataframes en la versión Spark 1.3. El marco de datos supera los desafíos clave que tenían los RDD.
Características del marco de datos: -
Colección distribuida de objetos de fila: un DataFrame es una colección distribuida de datos organizados en columnas con nombre. Es conceptualmente equivalente a una tabla en una base de datos relacional, pero con optimizaciones más completas.
Procesamiento de datos: procesamiento de formatos de datos estructurados y no estructurados (Avro, CSV, búsqueda elástica y Cassandra) y sistemas de almacenamiento (HDFS, tablas HIVE, MySQL, etc.). Puede leer y escribir desde todos estos diversos orígenes de datos.
Optimización mediante el catalizador optimizador: alimenta tanto las consultas SQL como la API de DataFrame. El marco de datos utiliza el marco de transformación del árbol catalizador en cuatro fases,
Compatibilidad de Hive: con Spark SQL, puede ejecutar consultas de Hive sin modificar en sus almacenes de Hive existentes. Reutiliza la interfaz de Hive y MetaStore y le brinda total compatibilidad con los datos, consultas y UDF existentes de Hive.
Tungsteno: Tungsteno proporciona un backend de ejecución física que gestiona explícitamente la memoria y genera dinámicamente bytecode para la evaluación de expresiones.
Lenguajes de programación compatibles: la
API de marco de datos está disponible en Java, Scala, Python y R.
Limitaciones del marco de datos: -
Ejemplo:
Esto es un desafío especialmente cuando trabajas con varios pasos de transformación y agregación.
Ejemplo:
API de conjuntos de datos
Características del conjunto de datos: -
Proporciona lo mejor de RDD y Dataframe: RDD (programación funcional, tipo seguro), DataFrame (modelo relacional, optimización de consultas, ejecución de tungsteno, clasificación y barajado)
Codificadores: con el uso de codificadores, es fácil convertir cualquier objeto JVM en un conjunto de datos, lo que permite a los usuarios trabajar con datos estructurados y no estructurados a diferencia de Dataframe.
Lenguajes de programación compatibles: la API de conjuntos de datos actualmente solo está disponible en Scala y Java. Python y R actualmente no son compatibles con la versión 1.6. El soporte de Python está programado para la versión 2.0.
Tipo de seguridad: Datasets API proporciona seguridad en tiempo de compilación que no estaba disponible en Dataframes. En el siguiente ejemplo, podemos ver cómo Dataset puede operar en objetos de dominio con funciones lambda de compilación.
Ejemplo:
Limitación de API de conjuntos de datos: -
Ejemplo:
No hay soporte para Python y R: a partir de la versión 1.6, los conjuntos de datos solo admiten Scala y Java. El soporte de Python se introducirá en Spark 2.0.
La API de conjuntos de datos ofrece varias ventajas sobre la RDD existente y la API de trama de datos con una mejor seguridad de tipo y programación funcional. Con el desafío de los requisitos de conversión de tipo en la API, aún no sería la seguridad de tipo requerida y hará que su código sea frágil.
fuente
Dataset
no es LINQ y la expresión lambda no puede interpretarse como árboles de expresión. Por lo tanto, hay recuadros negros y pierde casi todos los beneficios del optimizador (si no todos). Solo un pequeño subconjunto de posibles inconvenientes: Spark 2.0 Dataset vs DataFrame . Además, solo para repetir algo que dije varias veces: en general, la verificación de tipos de extremo a extremo no es posible conDataset
API. Las uniones son solo el ejemplo más destacado.Todos (RDD, DataFrame y DataSet) en una imagen.
créditos de imagen
RDD
DataFrame
Dataset
Nice comparison of all of them with a code snippet.
fuente
Si, ambos son posibles
1.
RDD
aDataFrame
con.toDF()
Más formas: Convierta un objeto RDD a Dataframe en Spark
2.
DataFrame
/DataSet
aRDD
con.rdd()
métodofuente
Porque
DataFrame
está mal escrito y los desarrolladores no obtienen los beneficios del sistema de tipos. Por ejemplo, supongamos que desea leer algo de SQL y ejecutar alguna agregación en él:Cuando dice
people("deptId")
, no está recuperando unInt
, o unLong
, está recuperando unColumn
objeto sobre el que necesita operar. En lenguajes con sistemas de tipo rico como Scala, terminas perdiendo toda la seguridad de tipos, lo que aumenta la cantidad de errores de tiempo de ejecución para cosas que se pueden descubrir en tiempo de compilación.Por el contrario,
DataSet[T]
está escrito. Cuando tu lo hagas:En realidad, está recuperando un
People
objeto, dondedeptId
es un tipo integral real y no un tipo de columna, aprovechando así el sistema de tipos.A partir de Spark 2.0, las API DataFrame y DataSet estarán unificadas, donde
DataFrame
habrá un alias de tipoDataSet[Row]
.fuente
Dataframe
es solo un alias paraDataset[Row]
DataFrame
era evitar romper los cambios de API. De todos modos, solo quería señalarlo. Gracias por la edición y el voto de mi parte.Simplemente
RDD
es un componente central, peroDataFrame
es una API introducida en spark 1.30.RDD
Colección de particiones de datos llamada
RDD
. EstasRDD
deben seguir algunas propiedades tales como:Aquí
RDD
está estructurado o no estructurado.Marco de datos
DataFrame
es una API disponible en Scala, Java, Python y R. Permite procesar cualquier tipo de datos estructurados y semiestructurados. Para definirDataFrame
, se llama una colección de datos distribuidos organizados en columnas con nombreDataFrame
. Puede optimizar fácilmenteRDDs
enDataFrame
. Puede procesar datos JSON, datos de parquet, datos HiveQL a la vez utilizandoDataFrame
.Aquí Sample_DF considera como
DataFrame
.sampleRDD
se llama (datos sin procesar)RDD
.fuente
La mayoría de las respuestas son correctas solo quieren agregar un punto aquí
En Spark 2.0, las dos API (DataFrame + DataSet) se unificarán en una sola API.
"Unificación de DataFrame y Dataset: en Scala y Java, DataFrame y Dataset se han unificado, es decir, DataFrame es solo un alias de tipo para Dataset of Row. En Python y R, dada la falta de seguridad de tipos, DataFrame es la interfaz de programación principal".
Los conjuntos de datos son similares a los RDD, sin embargo, en lugar de utilizar la serialización Java o Kryo, utilizan un codificador especializado para serializar los objetos para procesarlos o transmitirlos a través de la red.
Spark SQL admite dos métodos diferentes para convertir RDD existentes en conjuntos de datos. El primer método usa la reflexión para inferir el esquema de un RDD que contiene tipos específicos de objetos. Este enfoque basado en la reflexión conduce a un código más conciso y funciona bien cuando ya conoce el esquema mientras escribe su aplicación Spark.
El segundo método para crear conjuntos de datos es a través de una interfaz programática que le permite construir un esquema y luego aplicarlo a un RDD existente. Si bien este método es más detallado, le permite construir conjuntos de datos cuando las columnas y sus tipos no se conocen hasta el tiempo de ejecución.
Aquí puede encontrar RDD para la respuesta de conversación del marco de datos
Cómo convertir un objeto rdd a un marco de datos en spark
fuente
Un DataFrame es equivalente a una tabla en RDBMS y también se puede manipular de manera similar a las colecciones distribuidas "nativas" en los RDD. A diferencia de los RDD, los marcos de datos realizan un seguimiento del esquema y admiten varias operaciones relacionales que conducen a una ejecución más optimizada. Cada objeto DataFrame representa un plan lógico, pero debido a su naturaleza "perezosa" no se ejecuta ninguna ejecución hasta que el usuario llama a una "operación de salida" específica.
fuente
Pocas ideas desde la perspectiva de uso, RDD vs DataFrame:
¡Espero que ayude!
fuente
Un Dataframe es un RDD de objetos Row, cada uno representando un registro. Un Dataframe también conoce el esquema (es decir, los campos de datos) de sus filas. Si bien los Dataframes se parecen a los RDD normales, internamente almacenan datos de una manera más eficiente, aprovechando su esquema. Además, proporcionan nuevas operaciones que no están disponibles en los RDD, como la capacidad de ejecutar consultas SQL. Los marcos de datos se pueden crear a partir de fuentes de datos externas, de los resultados de consultas o de RDD regulares.
Referencia: Zaharia M., et al. Learning Spark (O'Reilly, 2015)
fuente
Spark RDD (resilient distributed dataset)
:RDD es la API principal de abstracción de datos y está disponible desde la primera versión de Spark (Spark 1.0). Es una API de nivel inferior para manipular la recopilación distribuida de datos. Las API RDD exponen algunos métodos extremadamente útiles que se pueden usar para obtener un control muy estricto sobre la estructura de datos físicos subyacente. Es una colección inmutable (solo lectura) de datos particionados distribuidos en diferentes máquinas. RDD permite el cálculo en memoria en grandes grupos para acelerar el procesamiento de grandes datos de una manera tolerante a fallas. Para habilitar la tolerancia a fallas, RDD usa DAG (Gráfico Acíclico Dirigido) que consiste en un conjunto de vértices y bordes. Los vértices y bordes en DAG representan el RDD y la operación que se aplicará en ese RDD respectivamente. Las transformaciones definidas en RDD son perezosas y se ejecutan solo cuando se llama a una acción
Spark DataFrame
:Spark 1.3 introdujo dos nuevas API de abstracción de datos: DataFrame y DataSet. Las API de DataFrame organizan los datos en columnas con nombre como una tabla en la base de datos relacional. Permite a los programadores definir esquemas en una colección distribuida de datos. Cada fila en un DataFrame es de fila de tipo de objeto. Al igual que una tabla SQL, cada columna debe tener el mismo número de filas en un DataFrame. En resumen, DataFrame es un plan vagamente evaluado que especifica las operaciones que deben realizarse en la recopilación distribuida de datos. DataFrame también es una colección inmutable.
Spark DataSet
:Como una extensión de las API de DataFrame, Spark 1.3 también introdujo las API de DataSet que proporcionan una interfaz de programación estrictamente tipada y orientada a objetos en Spark. Es una recopilación de datos distribuidos inmutable y segura. Al igual que DataFrame, las API de DataSet también usan el motor Catalyst para permitir la optimización de la ejecución. DataSet es una extensión de las API de DataFrame.
Other Differences
-fuente
Un DataFrame es un RDD que tiene un esquema. Puede pensarlo como una tabla de base de datos relacional, ya que cada columna tiene un nombre y un tipo conocido. El poder de DataFrames proviene del hecho de que, cuando crea un DataFrame a partir de un conjunto de datos estructurado (Json, Parquet ..), Spark puede inferir un esquema haciendo un pase sobre todo el conjunto de datos (Json, Parquet ..) siendo cargado Luego, al calcular el plan de ejecución, Spark puede usar el esquema y hacer optimizaciones de cálculo sustancialmente mejores. Tenga en cuenta que DataFrame se llamaba SchemaRDD antes de Spark v1.3.0
fuente
Apache Spark - RDD, DataFrame y DataSet
Spark RDD -
Spark Dataframe -
Conjunto de datos de chispa -
fuente
Puede usar RDD con estructurado y no estructurado, ya que el marco de datos / conjunto de datos solo puede procesar datos estructurados y semiestructurados (tiene el esquema adecuado)
fuente
Toda gran respuesta y el uso de cada API tiene algo de compensación. El conjunto de datos está diseñado para ser súper API para resolver muchos problemas, pero muchas veces RDD aún funciona mejor si comprende sus datos y si el algoritmo de procesamiento está optimizado para hacer muchas cosas en un solo paso a datos grandes, entonces RDD parece ser la mejor opción.
La agregación que usa la API del conjunto de datos todavía consume memoria y mejorará con el tiempo.
fuente