Entonces… cree que todos sus datos en un campo en specific son un tipo de cadena, pero cuando intenta ejecutar su consulta, obtiene algunos errores. Al investigar más, parece que también tiene algunos tipos int e indefinidos. Gorrón…
¡No te desesperes! De hecho, podemos solucionar esto (sin preparación de datos 😉). Para recapitular, en nuestro primer weblog, creamos una integración con MongoDB en Rockset, para que Rockset pueda leer y (actualizar) los datos que ingresan en MongoDB. Una vez que los datos están en Rockset, podemos ejecutar SQL en datos sin esquema y sin estructura.
Los datos:
Contenido incrustado: https://gist.github.com/nfarah86/ef1cc9da88e56226c4c46fd0e3c8e16e
estamos interesados en el release_date
campo: "release_date": "1991-06-07".
La consulta:
Rockset tiene una función llamada FECHA_PARAR(), que le permite convertir una fecha con formato de cadena en un objeto de fecha. Si desea solicitar películas solo por año, puede utilizar EXTRACTO().
Esencialmente, una vez que convierte su fecha con formato de cadena en un objeto de fecha, puede extraer el año.
A primera vista, esto parece bastante fácil de resolver: si desea ordenar todos los títulos de películas por año de lanzamiento, puede escribir algo como esto:
SELECT
t.title, t.release_date
FROM
commons.TwtichMovies t
ORDER BY
EXTRACT(
YEAR
FROM
DATE_PARSE(t.release_date, '%Y-%m-%d')
) DESC
;
Al ejecutar esta consulta, obtenemos un error de análisis de marca de tiempo: Error (Consulta) Error de análisis de marca de tiempo:
Esto podría significar que está trabajando con otros tipos de datos que no son cadenas. Para inspeccionar, puedes escribir algo como esto:
SELECT
t.title, TYPEOF(t.release_date)
FROM
commons.TwtichMovies t
WHERE
TYPEOF(t.release_date) != 'string'
;
Esto es lo que obtenemos de vuelta:
Ahora que sabemos qué está causando el error, podemos volver a escribir la consulta para descartar cualquier cosa que no sea un tipo de cadena, ¿verdad?
SELECT
t.title, t.release_date
FROM
commons.TwtichMovies t
WHERE
TYPEOF(t.release_date) = 'string';
ORDER BY
EXTRACT(
YEAR
FROM
DATE_PARSE(t.release_date, '%Y-%m-%d')
)DESC
;
¡MAL 🥺! Esto también devuelve un error de análisis de marca de tiempo:
Error (Consulta) Error de análisis de marca de tiempo
Probablemente te estés diciendo a ti mismo, “qué diablos”. Un caso que no tomamos en consideración anteriormente es que podría haber cadenas vacías 🤯- Si ejecutamos la siguiente consulta:
SELECT DATE_PARSE('', '%Y-%m-%d');
Obtenemos el mismo error de análisis de marca de tiempo:
Error (Consulta) Error de análisis de marca de tiempo
Ajá.
¿Cómo escribimos realmente esta consulta para evitar los errores de análisis de la marca de tiempo? Aquí, en realidad podemos comprobar el LONGITUD() de la cadena y filtre todo lo que no cumpla con el requisito de longitud, así que algo como esto:
WHERE LENGTH(t.release_date) = 10
También podemos TRY_CAST() t.release_date
a una cadena. Si el valor del campo no se puede convertir en una cadena, un null
se devuelve el valor (es decir, no se producirá un error). Poniendo todo esto junto, técnicamente podemos escribir algo como esto:
SELECT
t.title,
t.release_date
FROM
commons.TwtichMovies t
WHERE
TRY_CAST(t.release_date AS string) just isn't null
AND LENGTH(TRY_CAST(t.release_date AS string)) = 10
ORDER BY
EXTRACT(
YEAR
FROM
DATE_PARSE(t.release_date, '%Y-%m-%d')
)
;
¡Voila! ¡funciona!
Durante la transmisión, en realidad escribí una versión más complicada de esta consulta. La consulta anterior y la consulta en la secuencia son equivalentes. ¡También escribimos consultas que agregan! Puede ver el desglose completo de la sesión a continuación:
Contenido incrustado: https://youtu.be/PGpEsg7Qw7A
TLDR: puede encontrar todos los recursos que necesita para comenzar a usar Rockset en el rincón del desarrollador.