chore: Spark POC Case #2 - Initial commit.

parents
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.2/apache-maven-3.9.2-bin.zip
wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar
#!/bin/sh
# ----------------------------------------------------------------------------
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
# ----------------------------------------------------------------------------
# ----------------------------------------------------------------------------
# Apache Maven Wrapper startup batch script, version 3.2.0
#
# Required ENV vars:
# ------------------
# JAVA_HOME - location of a JDK home dir
#
# Optional ENV vars
# -----------------
# MAVEN_OPTS - parameters passed to the Java VM when running Maven
# e.g. to debug Maven itself, use
# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
# MAVEN_SKIP_RC - flag to disable loading of mavenrc files
# ----------------------------------------------------------------------------
if [ -z "$MAVEN_SKIP_RC" ] ; then
if [ -f /usr/local/etc/mavenrc ] ; then
. /usr/local/etc/mavenrc
fi
if [ -f /etc/mavenrc ] ; then
. /etc/mavenrc
fi
if [ -f "$HOME/.mavenrc" ] ; then
. "$HOME/.mavenrc"
fi
fi
# OS specific support. $var _must_ be set to either true or false.
cygwin=false;
darwin=false;
mingw=false
case "$(uname)" in
CYGWIN*) cygwin=true ;;
MINGW*) mingw=true;;
Darwin*) darwin=true
# Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
# See https://developer.apple.com/library/mac/qa/qa1170/_index.html
if [ -z "$JAVA_HOME" ]; then
if [ -x "/usr/libexec/java_home" ]; then
JAVA_HOME="$(/usr/libexec/java_home)"; export JAVA_HOME
else
JAVA_HOME="/Library/Java/Home"; export JAVA_HOME
fi
fi
;;
esac
if [ -z "$JAVA_HOME" ] ; then
if [ -r /etc/gentoo-release ] ; then
JAVA_HOME=$(java-config --jre-home)
fi
fi
# For Cygwin, ensure paths are in UNIX format before anything is touched
if $cygwin ; then
[ -n "$JAVA_HOME" ] &&
JAVA_HOME=$(cygpath --unix "$JAVA_HOME")
[ -n "$CLASSPATH" ] &&
CLASSPATH=$(cygpath --path --unix "$CLASSPATH")
fi
# For Mingw, ensure paths are in UNIX format before anything is touched
if $mingw ; then
[ -n "$JAVA_HOME" ] && [ -d "$JAVA_HOME" ] &&
JAVA_HOME="$(cd "$JAVA_HOME" || (echo "cannot cd into $JAVA_HOME."; exit 1); pwd)"
fi
if [ -z "$JAVA_HOME" ]; then
javaExecutable="$(which javac)"
if [ -n "$javaExecutable" ] && ! [ "$(expr "\"$javaExecutable\"" : '\([^ ]*\)')" = "no" ]; then
# readlink(1) is not available as standard on Solaris 10.
readLink=$(which readlink)
if [ ! "$(expr "$readLink" : '\([^ ]*\)')" = "no" ]; then
if $darwin ; then
javaHome="$(dirname "\"$javaExecutable\"")"
javaExecutable="$(cd "\"$javaHome\"" && pwd -P)/javac"
else
javaExecutable="$(readlink -f "\"$javaExecutable\"")"
fi
javaHome="$(dirname "\"$javaExecutable\"")"
javaHome=$(expr "$javaHome" : '\(.*\)/bin')
JAVA_HOME="$javaHome"
export JAVA_HOME
fi
fi
fi
if [ -z "$JAVACMD" ] ; then
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
else
JAVACMD="$(\unset -f command 2>/dev/null; \command -v java)"
fi
fi
if [ ! -x "$JAVACMD" ] ; then
echo "Error: JAVA_HOME is not defined correctly." >&2
echo " We cannot execute $JAVACMD" >&2
exit 1
fi
if [ -z "$JAVA_HOME" ] ; then
echo "Warning: JAVA_HOME environment variable is not set."
fi
# traverses directory structure from process work directory to filesystem root
# first directory with .mvn subdirectory is considered project base directory
find_maven_basedir() {
if [ -z "$1" ]
then
echo "Path not specified to find_maven_basedir"
return 1
fi
basedir="$1"
wdir="$1"
while [ "$wdir" != '/' ] ; do
if [ -d "$wdir"/.mvn ] ; then
basedir=$wdir
break
fi
# workaround for JBEAP-8937 (on Solaris 10/Sparc)
if [ -d "${wdir}" ]; then
wdir=$(cd "$wdir/.." || exit 1; pwd)
fi
# end of workaround
done
printf '%s' "$(cd "$basedir" || exit 1; pwd)"
}
# concatenates all lines of a file
concat_lines() {
if [ -f "$1" ]; then
# Remove \r in case we run on Windows within Git Bash
# and check out the repository with auto CRLF management
# enabled. Otherwise, we may read lines that are delimited with
# \r\n and produce $'-Xarg\r' rather than -Xarg due to word
# splitting rules.
tr -s '\r\n' ' ' < "$1"
fi
}
log() {
if [ "$MVNW_VERBOSE" = true ]; then
printf '%s\n' "$1"
fi
}
BASE_DIR=$(find_maven_basedir "$(dirname "$0")")
if [ -z "$BASE_DIR" ]; then
exit 1;
fi
MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}; export MAVEN_PROJECTBASEDIR
log "$MAVEN_PROJECTBASEDIR"
##########################################################################################
# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
# This allows using the maven wrapper in projects that prohibit checking in binary data.
##########################################################################################
wrapperJarPath="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar"
if [ -r "$wrapperJarPath" ]; then
log "Found $wrapperJarPath"
else
log "Couldn't find $wrapperJarPath, downloading it ..."
if [ -n "$MVNW_REPOURL" ]; then
wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar"
else
wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar"
fi
while IFS="=" read -r key value; do
# Remove '\r' from value to allow usage on windows as IFS does not consider '\r' as a separator ( considers space, tab, new line ('\n'), and custom '=' )
safeValue=$(echo "$value" | tr -d '\r')
case "$key" in (wrapperUrl) wrapperUrl="$safeValue"; break ;;
esac
done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties"
log "Downloading from: $wrapperUrl"
if $cygwin; then
wrapperJarPath=$(cygpath --path --windows "$wrapperJarPath")
fi
if command -v wget > /dev/null; then
log "Found wget ... using wget"
[ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--quiet"
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
wget $QUIET "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath"
else
wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath"
fi
elif command -v curl > /dev/null; then
log "Found curl ... using curl"
[ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--silent"
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath"
else
curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath"
fi
else
log "Falling back to using Java to download"
javaSource="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.java"
javaClass="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.class"
# For Cygwin, switch paths to Windows format before running javac
if $cygwin; then
javaSource=$(cygpath --path --windows "$javaSource")
javaClass=$(cygpath --path --windows "$javaClass")
fi
if [ -e "$javaSource" ]; then
if [ ! -e "$javaClass" ]; then
log " - Compiling MavenWrapperDownloader.java ..."
("$JAVA_HOME/bin/javac" "$javaSource")
fi
if [ -e "$javaClass" ]; then
log " - Running MavenWrapperDownloader.java ..."
("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$wrapperUrl" "$wrapperJarPath") || rm -f "$wrapperJarPath"
fi
fi
fi
fi
##########################################################################################
# End of extension
##########################################################################################
# If specified, validate the SHA-256 sum of the Maven wrapper jar file
wrapperSha256Sum=""
while IFS="=" read -r key value; do
case "$key" in (wrapperSha256Sum) wrapperSha256Sum=$value; break ;;
esac
done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties"
if [ -n "$wrapperSha256Sum" ]; then
wrapperSha256Result=false
if command -v sha256sum > /dev/null; then
if echo "$wrapperSha256Sum $wrapperJarPath" | sha256sum -c > /dev/null 2>&1; then
wrapperSha256Result=true
fi
elif command -v shasum > /dev/null; then
if echo "$wrapperSha256Sum $wrapperJarPath" | shasum -a 256 -c > /dev/null 2>&1; then
wrapperSha256Result=true
fi
else
echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available."
echo "Please install either command, or disable validation by removing 'wrapperSha256Sum' from your maven-wrapper.properties."
exit 1
fi
if [ $wrapperSha256Result = false ]; then
echo "Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised." >&2
echo "Investigate or delete $wrapperJarPath to attempt a clean download." >&2
echo "If you updated your Maven version, you need to update the specified wrapperSha256Sum property." >&2
exit 1
fi
fi
MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
# For Cygwin, switch paths to Windows format before running java
if $cygwin; then
[ -n "$JAVA_HOME" ] &&
JAVA_HOME=$(cygpath --path --windows "$JAVA_HOME")
[ -n "$CLASSPATH" ] &&
CLASSPATH=$(cygpath --path --windows "$CLASSPATH")
[ -n "$MAVEN_PROJECTBASEDIR" ] &&
MAVEN_PROJECTBASEDIR=$(cygpath --path --windows "$MAVEN_PROJECTBASEDIR")
fi
# Provide a "standardized" way to retrieve the CLI args that will
# work with both Windows and non-Windows executions.
MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $*"
export MAVEN_CMD_LINE_ARGS
WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
# shellcheck disable=SC2086 # safe args
exec "$JAVACMD" \
$MAVEN_OPTS \
$MAVEN_DEBUG_OPTS \
-classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
"-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
@REM ----------------------------------------------------------------------------
@REM Licensed to the Apache Software Foundation (ASF) under one
@REM or more contributor license agreements. See the NOTICE file
@REM distributed with this work for additional information
@REM regarding copyright ownership. The ASF licenses this file
@REM to you under the Apache License, Version 2.0 (the
@REM "License"); you may not use this file except in compliance
@REM with the License. You may obtain a copy of the License at
@REM
@REM https://www.apache.org/licenses/LICENSE-2.0
@REM
@REM Unless required by applicable law or agreed to in writing,
@REM software distributed under the License is distributed on an
@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@REM KIND, either express or implied. See the License for the
@REM specific language governing permissions and limitations
@REM under the License.
@REM ----------------------------------------------------------------------------
@REM ----------------------------------------------------------------------------
@REM Apache Maven Wrapper startup batch script, version 3.2.0
@REM
@REM Required ENV vars:
@REM JAVA_HOME - location of a JDK home dir
@REM
@REM Optional ENV vars
@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending
@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
@REM e.g. to debug Maven itself, use
@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
@REM ----------------------------------------------------------------------------
@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
@echo off
@REM set title of command window
title %0
@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
@REM set %HOME% to equivalent of $HOME
if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
@REM Execute a user defined script before this one
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
@REM check for pre script, once with legacy .bat ending and once with .cmd ending
if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %*
if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %*
:skipRcPre
@setlocal
set ERROR_CODE=0
@REM To isolate internal variables from possible post scripts, we use another setlocal
@setlocal
@REM ==== START VALIDATION ====
if not "%JAVA_HOME%" == "" goto OkJHome
echo.
echo Error: JAVA_HOME not found in your environment. >&2
echo Please set the JAVA_HOME variable in your environment to match the >&2
echo location of your Java installation. >&2
echo.
goto error
:OkJHome
if exist "%JAVA_HOME%\bin\java.exe" goto init
echo.
echo Error: JAVA_HOME is set to an invalid directory. >&2
echo JAVA_HOME = "%JAVA_HOME%" >&2
echo Please set the JAVA_HOME variable in your environment to match the >&2
echo location of your Java installation. >&2
echo.
goto error
@REM ==== END VALIDATION ====
:init
@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
@REM Fallback to current working directory if not found.
set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
set EXEC_DIR=%CD%
set WDIR=%EXEC_DIR%
:findBaseDir
IF EXIST "%WDIR%"\.mvn goto baseDirFound
cd ..
IF "%WDIR%"=="%CD%" goto baseDirNotFound
set WDIR=%CD%
goto findBaseDir
:baseDirFound
set MAVEN_PROJECTBASEDIR=%WDIR%
cd "%EXEC_DIR%"
goto endDetectBaseDir
:baseDirNotFound
set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
cd "%EXEC_DIR%"
:endDetectBaseDir
IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
@setlocal EnableExtensions EnableDelayedExpansion
for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
:endReadAdditionalConfig
SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
set WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar"
FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
IF "%%A"=="wrapperUrl" SET WRAPPER_URL=%%B
)
@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
if exist %WRAPPER_JAR% (
if "%MVNW_VERBOSE%" == "true" (
echo Found %WRAPPER_JAR%
)
) else (
if not "%MVNW_REPOURL%" == "" (
SET WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar"
)
if "%MVNW_VERBOSE%" == "true" (
echo Couldn't find %WRAPPER_JAR%, downloading it ...
echo Downloading from: %WRAPPER_URL%
)
powershell -Command "&{"^
"$webclient = new-object System.Net.WebClient;"^
"if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
"$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
"}"^
"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%WRAPPER_URL%', '%WRAPPER_JAR%')"^
"}"
if "%MVNW_VERBOSE%" == "true" (
echo Finished downloading %WRAPPER_JAR%
)
)
@REM End of extension
@REM If specified, validate the SHA-256 sum of the Maven wrapper jar file
SET WRAPPER_SHA_256_SUM=""
FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
IF "%%A"=="wrapperSha256Sum" SET WRAPPER_SHA_256_SUM=%%B
)
IF NOT %WRAPPER_SHA_256_SUM%=="" (
powershell -Command "&{"^
"$hash = (Get-FileHash \"%WRAPPER_JAR%\" -Algorithm SHA256).Hash.ToLower();"^
"If('%WRAPPER_SHA_256_SUM%' -ne $hash){"^
" Write-Output 'Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised.';"^
" Write-Output 'Investigate or delete %WRAPPER_JAR% to attempt a clean download.';"^
" Write-Output 'If you updated your Maven version, you need to update the specified wrapperSha256Sum property.';"^
" exit 1;"^
"}"^
"}"
if ERRORLEVEL 1 goto error
)
@REM Provide a "standardized" way to retrieve the CLI args that will
@REM work with both Windows and non-Windows executions.
set MAVEN_CMD_LINE_ARGS=%*
%MAVEN_JAVA_EXE% ^
%JVM_CONFIG_MAVEN_PROPS% ^
%MAVEN_OPTS% ^
%MAVEN_DEBUG_OPTS% ^
-classpath %WRAPPER_JAR% ^
"-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^
%WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
if ERRORLEVEL 1 goto error
goto end
:error
set ERROR_CODE=1
:end
@endlocal & set ERROR_CODE=%ERROR_CODE%
if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost
@REM check for post script, once with legacy .bat ending and once with .cmd ending
if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat"
if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd"
:skipRcPost
@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
if "%MAVEN_BATCH_PAUSE%"=="on" pause
if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE%
cmd /C exit /B %ERROR_CODE%
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.nisum</groupId>
<artifactId>inventory-process-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>inventory-process-api</name>
<description>Demo project for Spring Boot</description>
<properties>
<spark.version>3.2.1</spark.version>
<scala.version.major>2.12</scala.version.major>
<scala.version.minor>11</scala.version.minor>
<scala.version>${scala.version.major}.${scala.version.minor}</scala.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<springframework.version>5.3.24</springframework.version>
<kafka.version>2.6.0</kafka.version>
<zookeeper.version>3.5.8</zookeeper.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/io.projectreactor.kafka/reactor-kafka -->
<dependency>
<groupId>io.projectreactor.kafka</groupId>
<artifactId>reactor-kafka</artifactId>
<version>1.1.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.26</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb-reactive</artifactId>
</dependency>
<dependency>
<groupId>de.flapdoodle.embed</groupId>
<artifactId>de.flapdoodle.embed.mongo</artifactId>
<version>4.7.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.5.3.Final</version>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver-reactivestreams</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver-sync</artifactId>
<version>4.0.5</version>
</dependency>
<!-- Spark Streaming -->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-streaming_2.12</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql-kafka-0-10_2.12</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-streaming-kafka-0-10_2.12</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka_2.12</artifactId>
<version>${kafka.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.spark/spark-core -->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.12</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.12</artifactId>
<version>${spark.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.codehaus.janino/janino -->
<dependency>
<groupId>org.codehaus.janino</groupId>
<artifactId>janino</artifactId>
<version>3.0.16</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.5.3.Final</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.26</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-mapstruct-binding</artifactId>
<version>0.2.0</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>
</project>
package com.nisum.inventory;
import org.springframework.boot.WebApplicationType;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
@SpringBootApplication
public class InventoryProcessApiApplication {
public static void main(String[] args) {
new SpringApplicationBuilder(InventoryProcessApiApplication.class)
.web(WebApplicationType.REACTIVE)
.run(args);
}
}
package com.nisum.inventory.collection;
import com.nisum.inventory.dto.ImageCredit;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import java.util.ArrayList;
import java.util.Date;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Document("inventory")
public class ProcessedInventory {
@Id
private String id;
private ImageCredit imageCredit;
private ArrayList<String> tags;
private String imageUrl;
private String filename;
private String imageHash;
private Double price;
private String name;
private String description;
private String slug;
private Long added;
private String manufacturer;
private String itemType;
private String productImg;
private Date createdDate;
private String status;
}
package com.nisum.inventory.controller;
import com.nisum.inventory.dto.KafkaPublisherResponse;
import com.nisum.inventory.dto.Root;
import com.nisum.inventory.service.InventoryService;
import lombok.extern.slf4j.Slf4j;
import org.apache.spark.sql.streaming.StreamingQueryException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.codec.multipart.FilePart;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;
import java.util.concurrent.TimeoutException;
@Slf4j
@RestController
@RequestMapping(path = "/inventory")
public class InventoryController {
@Autowired
private InventoryService inventoryService;
@PostMapping(value = "/upload-data", consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseStatus(value = HttpStatus.OK)
public Flux<KafkaPublisherResponse> upload(@RequestPart("files") Flux<FilePart> filePartFlux){
return inventoryService.saveAndProcess(filePartFlux);
}
@GetMapping(value = "/get",produces = MediaType.TEXT_EVENT_STREAM_VALUE)
@ResponseStatus(value = HttpStatus.OK)
public Flux<Root> getProductData(@RequestParam("batchId") String batchId) throws TimeoutException, StreamingQueryException {
return inventoryService.getProcessedInventory(batchId);
}
}
package com.nisum.inventory.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class FileUploadAttributes {
private String fileName;
private String fileContent;
}
package com.nisum.inventory.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ImageCredit {
private String artist;
private String link;
}
package com.nisum.inventory.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class KafkaPublisherResponse {
private String topicName;
private String batchId;
private String status;
}
package com.nisum.inventory.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.ArrayList;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class RawInventory implements Serializable {
private ImageCredit imageCredit;
private ArrayList<String> tags;
private String imageUrl;
private String filename;
private String imageHash;
private Double price;
private String name;
private String description;
private String slug;
private Long added;
private String manufacturer;
private String itemType;
private String productImg;
}
package com.nisum.inventory.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Root {
private List<RawInventory> inventoryList;
private String uniqueId;
private String batchId;
}
package com.nisum.inventory.service;
import com.nisum.inventory.dto.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.spark.sql.*;
import org.apache.spark.sql.execution.streaming.sources.ForeachWriterTable;
import org.apache.spark.sql.streaming.OutputMode;
import org.apache.spark.sql.streaming.StreamingQuery;
import org.apache.spark.sql.streaming.StreamingQueryException;
import org.apache.spark.sql.streaming.Trigger;
import org.apache.spark.sql.types.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.buffer.DataBufferUtils;
import org.springframework.http.codec.multipart.FilePart;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;
import java.io.File;
import java.io.IOException;
import java.io.Serializable;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.TimeoutException;
@Slf4j
@Service
public class InventoryService implements Serializable {
@Autowired
private SparkSession sparkSession;
@Autowired
private StructType schema;
public Flux<KafkaPublisherResponse> saveAndProcess(Flux<FilePart> filePartFlux) {
return filePartFlux.flatMap(filePart ->
filePart.content().map(dataBuffer -> {
byte[] bytes = new byte[dataBuffer.capacity()];
dataBuffer.read(bytes);
DataBufferUtils.release(dataBuffer);
return FileUploadAttributes.builder()
.fileContent(new String(bytes, StandardCharsets.UTF_8))
.fileName(filePart.filename())
.build();
})
.map(content -> saveAsFile(content))
.map(fileName -> readAndPublishDataToKafka(fileName))
.map(kafkaPublisherResponse -> kafkaPublisherResponse));
}
private String saveAsFile(FileUploadAttributes fileUploadAttributes) {
try {
FileUtils.deleteDirectory(new File("src/main/resources/data/CheckPointLocation"));
} catch (IOException e) {
log.error("Error while deleting checkpoint location dir {}", e.getMessage());
}
String batchId= new SimpleDateFormat("HHmmssSSS").format(new Date());
String dir="src/main/resources/data/"+batchId;
String fileName = dir+ File.separator + fileUploadAttributes.getFileName();
try {
FileUtils.forceMkdir(new File(dir));
FileUtils.writeStringToFile(new File(fileName)
, fileUploadAttributes.getFileContent(), StandardCharsets.UTF_8, true);
return batchId;
} catch (IOException e) {
if (e instanceof IOException)
log.error("Error while creating CSV... {}", e.getMessage());
return StringUtils.EMPTY;
}
}
private KafkaPublisherResponse readAndPublishDataToKafka(String batchId) {
if (StringUtils.isNotEmpty(batchId)) {
String topicName = "test-inventory2";
try {
populateInventoryDataUsingDFStruct(batchId, topicName);
return KafkaPublisherResponse.builder()
.topicName(topicName)
.batchId(batchId)
.status("File data pushed to Kafka topic.").build();
} catch (TimeoutException | StreamingQueryException e) {
if (e instanceof TimeoutException)
log.error("TimeoutException... {}", e.getMessage());
if (e instanceof StreamingQueryException)
log.error("StreamingQueryException {}", e.getMessage());
return KafkaPublisherResponse.builder().topicName(topicName).status(e.getMessage()).build();
}
}else
{
return KafkaPublisherResponse.builder().build();
}
}
public void populateInventoryDataUsingDFStruct(String batchId,String topicName) throws TimeoutException, StreamingQueryException {
StructType structType = Encoders.bean(Root.class).schema();
Dataset<Row> df=sparkSession.readStream()
.format("json")
.option("multiline",true)
.schema(structType)
.load("src/main/resources/data/"+batchId);
//df.printSchema();
Dataset<Row> rowDataset=df
.withColumn("uniqueId", functions.lit(UUID.randomUUID().toString()))
.withColumn("batchId",functions.lit(batchId));
rowDataset.selectExpr("CAST(batchId AS STRING) AS key", "to_json(struct(*)) AS value")
.writeStream()
.format("kafka")
.trigger(Trigger.Once())
.option("kafka.bootstrap.servers", "HYD-LAP-00484.corp.nisum.com:9092")
.option("topic", topicName)
.option("checkpointLocation", "src/main/resources/data/CheckPointLocation")
.start()
.awaitTermination(5000);
}
public Flux<Root> getProcessedInventory(String batchId) throws TimeoutException, StreamingQueryException {
Dataset<Row> df = sparkSession
.readStream()
.format("kafka")
.option("kafka.bootstrap.servers", "HYD-LAP-00484.corp.nisum.com:9092")
.option("subscribe", "test-inventory2")
.option("startingOffsets", "earliest")
.option("startingOffsets", "earliest")
.option("failOnDataLoss", "false")
.option("multiline",true)
.option("kafka.con.group.id", "localStream")
.load();
StructType schema = Encoders.bean(Root.class).schema();
df.printSchema();
Dataset<Row> inventoryList=df
.filter(functions.col("key").equalTo(batchId))
.selectExpr("CAST(value as String) as message")
.select(functions.from_json(functions.col("message"),schema ).as("data"))
.select(functions.explode(functions.col("data.inventoryList")).as("list"))
.filter(functions.col("list.name").equalTo("Handcrafted Trees Mug"))
.select("list.*");
StreamingQuery streamingQuery=inventoryList
.writeStream()
.trigger(Trigger.Once())
.format("json")
.option("multiline",true)
.option("checkpointLocation", "src/main/resources/data/checkpointLocation/StreamingJob")
.option("path","src/main/resources/data/"+batchId)
.outputMode(OutputMode.Append())
.start();
streamingQuery.awaitTermination();
return Flux.empty();
}
}
package com.nisum.inventory.utils;
import com.mongodb.reactivestreams.client.MongoClient;
import com.mongodb.reactivestreams.client.MongoClients;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.config.AbstractReactiveMongoConfiguration;
import org.springframework.data.mongodb.repository.config.EnableReactiveMongoRepositories;
@Configuration
@EnableReactiveMongoRepositories(basePackages = "com.nisum.inventory")
public class ReactiveMongoConfig extends AbstractReactiveMongoConfiguration{
@Override
public MongoClient reactiveMongoClient() {
return MongoClients.create();
}
@Override
protected String getDatabaseName() {
return "orderdb";
}
}
\ No newline at end of file
package com.nisum.inventory.utils;
import org.apache.spark.sql.types.DataTypes;
import org.apache.spark.sql.types.Metadata;
import org.apache.spark.sql.types.StructField;
import org.apache.spark.sql.types.StructType;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SchemaConfig {
@Bean
public StructType schema()
{
StructField[] structFields= new StructField[9];
structFields[0]= new StructField("imageUrl", DataTypes.StringType,true, Metadata.empty());
structFields[1]= new StructField("filename",DataTypes.StringType,true,Metadata.empty());
structFields[2]= new StructField("imageHash",DataTypes.StringType,true,Metadata.empty());
structFields[3]= new StructField("name",DataTypes.StringType,true,Metadata.empty());
structFields[4]= new StructField("description",DataTypes.StringType,true,Metadata.empty());
structFields[5]= new StructField("slug",DataTypes.StringType,true,Metadata.empty());
structFields[6]= new StructField("manufacturer",DataTypes.StringType,true,Metadata.empty());
structFields[7]= new StructField("itemType",DataTypes.StringType,true,Metadata.empty());
structFields[8]= new StructField("productImg",DataTypes.StringType,true,Metadata.empty());
return new StructType(structFields);
}
}
package com.nisum.inventory.utils;
import org.apache.spark.sql.SparkSession;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SparkConfiguaration {
@Bean
public SparkSession sparkSession()
{
return SparkSession
.builder()
.appName("Product info API")
.master("local[1]")
.getOrCreate();
}
}
spring.http.multipart.max-file-size=2GB
spring.http.multipart.max-request-size=2GB
spring.data.mongodb.uri=mongodb://localhost:27017/inventorydb
spring.data.mongodb.database=inventorydb
v1
{"path":"file:///D:/Work/events/inventory-process-api/src/main/resources/data/194409539/part-00000-b646badc-bfc7-4cec-b945-b25a5202338b-c000.json","size":607,"isDir":false,"modificationTime":1686752103529,"blockReplication":1,"blockSize":33554432,"action":"add"}
\ No newline at end of file
{
"inventoryList": [
{
"imageCredit": {
"artist": "Martin Wessely",
"link": "http://www.resplashed.com/photographer/martin_wessely/"
},
"tags": [
"Trees"
],
"imageUrl": "http://www.resplashed.com/img/400_002e1ecb8bd2.jpg",
"filename": "400_002e1ecb8bd2.jpg",
"imageHash": "2b1d5b5ef4b37b4f5d0dccade1b69987",
"price": 10.99,
"name": "Handcrafted Trees Mug",
"description": "enim corporis voluptatibus laudantium possimus alias dolorem voluptatem similique aut aliquam voluptatem voluptatem omnis id consequatur",
"slug": "Handcrafted-Trees-Mug",
"added": 1485723766805,
"manufacturer": "OHara-Group",
"itemType": "mug",
"productImg": "mug-400_002e1ecb8bd2.jpg"
},
{
"imageCredit": {
"artist": "Patrick Fore",
"link": "http://www.resplashed.com/photographer/patrick_fore/"
},
"tags": [
"Beach",
"Ocean",
"Water"
],
"imageUrl": "http://www.resplashed.com/img/400_00b425ea69e0.jpg",
"filename": "400_00b425ea69e0.jpg",
"imageHash": "9197d084a8309c5cc1c1860063bc4dda",
"price": 19.99,
"name": "Rustic Beach Mug",
"description": "totam at veritatis eligendi assumenda ex quia praesentium quibusdam ducimus",
"slug": "Rustic-Beach-Mug",
"added": 1481573896833,
"manufacturer": "Sipes-Inc",
"itemType": "mug",
"productImg": "mug-400_00b425ea69e0.jpg"
},
{
"imageCredit": {
"artist": "Adam Willoughby-Knox",
"link": "http://www.resplashed.com/photographer/adam_willoughby-knox/"
},
"tags": [
"Animal",
"Bear"
],
"imageUrl": "http://www.resplashed.com/img/400_016a0ffdc46d.jpg",
"filename": "400_016a0ffdc46d.jpg",
"imageHash": "7389141c2b2657f5b2531cfd8c290759",
"price": 17.99,
"name": "Handcrafted Bear Mug",
"description": "vitae mollitia et in accusantium est voluptas officiis est non",
"slug": "Handcrafted-Bear-Mug",
"added": 1485991071829,
"manufacturer": "Weissnat-Schowalter-and-Koelpin",
"itemType": "mug",
"productImg": "mug-400_016a0ffdc46d.jpg"
},
{
"imageCredit": {
"artist": "Eric Huang",
"link": "http://www.resplashed.com/photographer/eric_huang/"
},
"tags": [
"Road"
],
"imageUrl": "http://www.resplashed.com/img/400_01828ff91dc5.jpg",
"filename": "400_01828ff91dc5.jpg",
"imageHash": "acf59094c5fe008880e72aa4a16bd6ee",
"price": 15.99,
"name": "Refined Road Mug",
"description": "explicabo fugit magnam fugit dolorem itaque unde quidem est quia ut a veritatis sit facere possimus fugit ipsam",
"slug": "Refined-Road-Mug",
"added": 1482213983048,
"manufacturer": "Bernier-Hane",
"itemType": "mug",
"productImg": "mug-400_01828ff91dc5.jpg"
},
{
"imageCredit": {
"artist": "Olivia Henry",
"link": "http://www.resplashed.com/photographer/olivia_henry/"
},
"tags": [
"Ocean",
"Rocks"
],
"imageUrl": "http://www.resplashed.com/img/400_018cf84f5121.jpg",
"filename": "400_018cf84f5121.jpg",
"imageHash": "2967736ddb9ae0fdf18563622fccb2cc",
"price": 10.99,
"name": "Unbranded Ocean Mug",
"description": "facilis aut velit vitae sit dolorum illum nostrum pariatur dolorem vel atque quasi placeat qui",
"slug": "Unbranded-Ocean-Mug",
"added": 1483408192004,
"manufacturer": "Franecki---Gaylord",
"itemType": "mug",
"productImg": "mug-400_018cf84f5121.jpg"
},
{
"imageCredit": {
"artist": "Zwaddi",
"link": "http://www.resplashed.com/photographer/zwaddi/"
},
"tags": [
"Sunset",
"Beach",
"Ocean"
],
"imageUrl": "http://www.resplashed.com/img/400_01ca9c693d2c.jpg",
"filename": "400_01ca9c693d2c.jpg",
"imageHash": "0753f3afeee4eda16d0b6e5775ee2b29",
"price": 9.99,
"name": "Rustic Ocean Mug",
"description": "libero reprehenderit blanditiis quidem laborum ullam quae fuga consequuntur minima praesentium consequatur qui excepturi nostrum tempora sunt deleniti",
"slug": "Rustic-Ocean-Mug",
"added": 1485511118573,
"manufacturer": "Bayer-and-Sons",
"itemType": "mug",
"productImg": "mug-400_01ca9c693d2c.jpg"
},
{
"imageCredit": {
"artist": "jamie mink",
"link": "http://www.resplashed.com/photographer/jamie_mink/"
},
"tags": [
"Rust",
"Old",
"Car"
],
"imageUrl": "http://www.resplashed.com/img/400_01d403b11a9b.jpg",
"filename": "400_01d403b11a9b.jpg",
"imageHash": "40dd32ff718ba70b8b8a1850e530d2e2",
"price": 19.99,
"name": "Sleek Old Mug",
"description": "necessitatibus suscipit iure quia voluptates voluptas quidem ipsum laboriosam adipisci",
"slug": "Sleek-Old-Mug",
"added": 1485759837725,
"manufacturer": "Boyle-LLC",
"itemType": "mug",
"productImg": "mug-400_01d403b11a9b.jpg"
},
{
"imageCredit": {
"artist": "Justin Leibow",
"link": "http://www.resplashed.com/photographer/justin_leibow/"
},
"tags": [
"Coffee"
],
"imageUrl": "http://www.resplashed.com/img/400_01fdff8681fc.jpg",
"filename": "400_01fdff8681fc.jpg",
"imageHash": "abc437b613c34ab96391291112b6187b",
"price": 14.99,
"name": "Sleek Coffee Mug",
"description": "et adipisci explicabo consequatur rerum voluptas dolorem qui omnis vel",
"slug": "Sleek-Coffee-Mug",
"added": 1479259996312,
"manufacturer": "Franecki---Gaylord",
"itemType": "mug",
"productImg": "mug-400_01fdff8681fc.jpg"
},
{
"imageCredit": {
"artist": "Stefania Bonacasa",
"link": "http://www.resplashed.com/photographer/stefania_bonacasa/"
},
"tags": [
"Trees",
"Fog",
"People"
],
"imageUrl": "http://www.resplashed.com/img/400_026bcd988f43.jpg",
"filename": "400_026bcd988f43.jpg",
"imageHash": "119b67f433042dd6ee733e4cb4096077",
"price": 16.99,
"name": "Rustic Trees Mug",
"description": "ut architecto est similique sit nostrum sit sed ipsa itaque aliquam nesciunt reprehenderit et neque aut id nulla dolore sed sit facere eligendi",
"slug": "Rustic-Trees-Mug",
"added": 1480664800826,
"manufacturer": "Weissnat-Schowalter-and-Koelpin",
"itemType": "mug",
"productImg": "mug-400_026bcd988f43.jpg"
},
{
"imageCredit": {
"artist": "Dirk Sebregts",
"link": "http://www.resplashed.com/photographer/dirk_sebregts/"
},
"tags": [
"Sunset",
"Ocean",
"Dock"
],
"imageUrl": "http://www.resplashed.com/img/400_02a652e6d7b5.jpg",
"filename": "400_02a652e6d7b5.jpg",
"imageHash": "95f051dc9e6c3724889318ac07d7f6bd",
"price": 18.99,
"name": "Sleek Ocean Mug",
"description": "magnam maxime nostrum minima dolores repellat laborum pariatur et quia maiores quidem eos quod est voluptas voluptatem quia ipsum odit dolorem et blanditiis aut voluptates",
"slug": "Sleek-Ocean-Mug",
"added": 1485278625462,
"manufacturer": "Cruickshank-Bayer-and-Gerlach",
"itemType": "mug",
"productImg": "mug-400_02a652e6d7b5.jpg"
},
{
"imageCredit": {
"artist": "Zwaddi",
"link": "http://www.resplashed.com/photographer/zwaddi/"
},
"tags": [
"Person",
"Hills",
"Animals",
"Sheep"
],
"imageUrl": "http://www.resplashed.com/img/400_03426de5ad3d.jpg",
"filename": "400_03426de5ad3d.jpg",
"imageHash": "91e6a045e1df35a7fac02fe9e28bf216",
"price": 16.99,
"name": "Ergonomic Person Mug",
"description": "sunt id omnis nihil consectetur et porro ut molestias ab et rem quia omnis voluptatem est libero reiciendis voluptatem dolores excepturi",
"slug": "Ergonomic-Person-Mug",
"added": 1485835498313,
"manufacturer": "Rice-Inc",
"itemType": "mug",
"productImg": "mug-400_03426de5ad3d.jpg"
},
{
"imageCredit": {
"artist": "Taylor Leopold",
"link": "http://www.resplashed.com/photographer/taylor_leopold/"
},
"tags": [
"Fog",
"Lake",
"Water"
],
"imageUrl": "http://www.resplashed.com/img/400_0425cc46e03b.jpg",
"filename": "400_0425cc46e03b.jpg",
"imageHash": "98eb4a12a37feb52e2b6f77eb46f2fe4",
"price": 9.99,
"name": "Gorgeous Water Mug",
"description": "perspiciatis in qui et nemo nisi ad quam consequatur et dignissimos",
"slug": "Gorgeous-Water-Mug",
"added": 1485880263998,
"manufacturer": "Boyle-LLC",
"itemType": "mug",
"productImg": "mug-400_0425cc46e03b.jpg"
},
{
"imageCredit": {
"artist": "Zwaddi",
"link": "http://www.resplashed.com/photographer/zwaddi/"
},
"tags": [
"Person",
"Fog"
],
"imageUrl": "http://www.resplashed.com/img/400_043971bc342c.jpg",
"filename": "400_043971bc342c.jpg",
"imageHash": "b6beb3ba43a826daf115e7701dd64c80",
"price": 14.99,
"name": "Generic Fog Mug",
"description": "consectetur voluptas sint excepturi voluptas aut culpa qui excepturi dicta ut voluptas",
"slug": "Generic-Fog-Mug",
"added": 1484633915311,
"manufacturer": "McCullough---Lueilwitz",
"itemType": "mug",
"productImg": "mug-400_043971bc342c.jpg"
},
{
"imageCredit": {
"artist": "Sylwia Bartyzel",
"link": "http://www.resplashed.com/photographer/sylwia_bartyzel/"
},
"tags": [
"Building",
"Metal"
],
"imageUrl": "http://www.resplashed.com/img/400_04b2ced862ff.jpg",
"filename": "400_04b2ced862ff.jpg",
"imageHash": "d64b91cd71d94ba6e3632619041d4483",
"price": 11.99,
"name": "Gorgeous Building Mug",
"description": "quisquam maxime laudantium error totam unde commodi ullam qui quo sed aperiam",
"slug": "Gorgeous-Building-Mug",
"added": 1482336621275,
"manufacturer": "Sipes-Inc",
"itemType": "mug",
"productImg": "mug-400_04b2ced862ff.jpg"
},
{
"imageCredit": {
"artist": "Morgan Sessions",
"link": "http://www.resplashed.com/photographer/morgan_sessions/"
},
"tags": [
"Sunset",
"Person",
"Woman",
"Meadow"
],
"imageUrl": "http://www.resplashed.com/img/400_04fd54d3883a.jpg",
"filename": "400_04fd54d3883a.jpg",
"imageHash": "72d6644be34ea42f0a144db409ff77a1",
"price": 10.99,
"name": "Intelligent Sunset Mug",
"description": "qui ipsa hic voluptas et rem sed architecto reiciendis labore saepe fugit ab sed sed quos ut adipisci accusantium molestias",
"slug": "Intelligent-Sunset-Mug",
"added": 1484735389245,
"manufacturer": "Bernier-Hane",
"itemType": "mug",
"productImg": "mug-400_04fd54d3883a.jpg"
},
{
"imageCredit": {
"artist": "Zwaddi",
"link": "http://www.resplashed.com/photographer/zwaddi/"
},
"tags": [
"Person",
"Coffee"
],
"imageUrl": "http://www.resplashed.com/img/400_054141a0facb.jpg",
"filename": "400_054141a0facb.jpg",
"imageHash": "55643697fc9839d3bd89ccbe309e3e53",
"price": 11.99,
"name": "Unbranded Coffee Mug",
"description": "soluta eligendi harum quis molestiae omnis excepturi deserunt sed dolorum dolorum ea non dolor",
"slug": "Unbranded-Coffee-Mug",
"added": 1484144067274,
"manufacturer": "Lowe-Wunsch-and-Stoltenberg",
"itemType": "mug",
"productImg": "mug-400_054141a0facb.jpg"
},
{
"imageCredit": {
"artist": "Pavel Voinov",
"link": "http://www.resplashed.com/photographer/pavel_voinov/"
},
"tags": [
"Trees",
"Road"
],
"imageUrl": "http://www.resplashed.com/img/400_05902e9ad4b0.jpg",
"filename": "400_05902e9ad4b0.jpg",
"imageHash": "bdb55f06bcc209a72474d902cc5b60b2",
"price": 9.99,
"name": "Rustic Road Mug",
"description": "est ad ipsa et ipsum amet nemo cupiditate placeat praesentium qui illum harum",
"slug": "Rustic-Road-Mug",
"added": 1480653821277,
"manufacturer": "Metz---Kautzer",
"itemType": "mug",
"productImg": "mug-400_05902e9ad4b0.jpg"
},
{
"imageCredit": {
"artist": "Zwaddi",
"link": "http://www.resplashed.com/photographer/zwaddi/"
},
"tags": [
"Windows",
"Architecture",
"Building"
],
"imageUrl": "http://www.resplashed.com/img/400_0594b2a027c0.jpg",
"filename": "400_0594b2a027c0.jpg",
"imageHash": "9c29f87e053d9a8124fdb04c74d7a294",
"price": 17.99,
"name": "Sleek Building Mug",
"description": "in cumque suscipit et perspiciatis minima ut et consequatur ab neque rerum hic dolore a aut dignissimos",
"slug": "Sleek-Building-Mug",
"added": 1478843419299,
"manufacturer": "Feil-Dooley-and-Reinger",
"itemType": "mug",
"productImg": "mug-400_0594b2a027c0.jpg"
},
{
"imageCredit": {
"artist": "Zwaddi",
"link": "http://www.resplashed.com/photographer/zwaddi/"
},
"tags": [
"House",
"Trees",
"Fog",
"Secluded"
],
"imageUrl": "http://www.resplashed.com/img/400_05e4bc8bae40.jpg",
"filename": "400_05e4bc8bae40.jpg",
"imageHash": "27abe66013bd259c11438f0870df13c1",
"price": 20.99,
"name": "Tasty Secluded Mug",
"description": "non et omnis accusantium ut non voluptatem sunt iusto cumque laudantium sunt laboriosam et sequi et totam voluptatem aut vero occaecati quia laudantium",
"slug": "Tasty-Secluded-Mug",
"added": 1482236584965,
"manufacturer": "Konopelski-Group",
"itemType": "mug",
"productImg": "mug-400_05e4bc8bae40.jpg"
},
{
"imageCredit": {
"artist": "Zwaddi",
"link": "http://www.resplashed.com/photographer/zwaddi/"
},
"tags": [
"Architecture",
"Wall"
],
"imageUrl": "http://www.resplashed.com/img/400_0653c10d6dd7.jpg",
"filename": "400_0653c10d6dd7.jpg",
"imageHash": "5408f3caebb3bf41ef1d633eb21b0fc8",
"price": 14.99,
"name": "Ergonomic Architecture Mug",
"description": "rerum sit voluptatibus sint voluptatem saepe delectus et quasi perferendis laborum et enim dolores quaerat iusto eos odio nisi",
"slug": "Ergonomic-Architecture-Mug",
"added": 1484099772336,
"manufacturer": "Franecki---Gaylord",
"itemType": "mug",
"productImg": "mug-400_0653c10d6dd7.jpg"
},
{
"imageCredit": {
"artist": "delfi de la Rua",
"link": "http://www.resplashed.com/photographer/delfi_de_la_rua/"
},
"tags": [
"Surf",
"Ocean",
"Waves"
],
"imageUrl": "http://www.resplashed.com/img/400_068d8b16aaed.jpg",
"filename": "400_068d8b16aaed.jpg",
"imageHash": "14d44fa1fb67fcf02a8564b459842013",
"price": 12.99,
"name": "Intelligent Waves Mug",
"description": "architecto amet doloremque sit ut repudiandae ducimus rerum enim aut veniam autem aut ut ea consectetur est excepturi explicabo aliquid",
"slug": "Intelligent-Waves-Mug",
"added": 1481166939534,
"manufacturer": "Metz---Kautzer",
"itemType": "mug",
"productImg": "mug-400_068d8b16aaed.jpg"
},
{
"imageCredit": {
"artist": "Ariana Prestes",
"link": "http://www.resplashed.com/photographer/ariana_prestes/"
},
"tags": [
"Bike",
"City",
"People"
],
"imageUrl": "http://www.resplashed.com/img/400_06e97ddd721b.jpg",
"filename": "400_06e97ddd721b.jpg",
"imageHash": "b140f42891b964fa6f26a9ca709e0164",
"price": 17.99,
"name": "Intelligent City Mug",
"description": "sit animi repellendus voluptas vitae consequatur accusantium optio cupiditate et",
"slug": "Intelligent-City-Mug",
"added": 1478209012932,
"manufacturer": "Weissnat-Schowalter-and-Koelpin",
"itemType": "mug",
"productImg": "mug-400_06e97ddd721b.jpg"
},
{
"imageCredit": {
"artist": "Zwaddi",
"link": "http://www.resplashed.com/photographer/zwaddi/"
},
"tags": [
"Sky",
"Fog"
],
"imageUrl": "http://www.resplashed.com/img/400_0714ae0188d2.jpg",
"filename": "400_0714ae0188d2.jpg",
"imageHash": "b1fe814797d65921498d6b78fb63a200",
"price": 18.99,
"name": "Refined Sky Mug",
"description": "non est voluptatem sint nulla dicta iste natus consequatur accusantium dolores dolore in et distinctio dolore similique",
"slug": "Refined-Sky-Mug",
"added": 1481150082814,
"manufacturer": "Konopelski-Group",
"itemType": "mug",
"productImg": "mug-400_0714ae0188d2.jpg"
},
{
"imageCredit": {
"artist": "Zwaddi",
"link": "http://www.resplashed.com/photographer/zwaddi/"
},
"tags": [
"Rust",
"Machine",
"Car"
],
"imageUrl": "http://www.resplashed.com/img/400_072315da7b27.jpg",
"filename": "400_072315da7b27.jpg",
"imageHash": "7f282c7ce86db46f09e9e4eca25169cf",
"price": 12.99,
"name": "Incredible Car Mug",
"description": "rerum vero cupiditate et est similique soluta ex sit ex esse repellat necessitatibus voluptatum corrupti et nihil quod",
"slug": "Incredible-Car-Mug",
"added": 1484684041316,
"manufacturer": "Boyle-LLC",
"itemType": "mug",
"productImg": "mug-400_072315da7b27.jpg"
},
{
"imageCredit": {
"artist": "Zwaddi",
"link": "http://www.resplashed.com/photographer/zwaddi/"
},
"tags": [
"Animal",
"Fur",
"Monkey"
],
"imageUrl": "http://www.resplashed.com/img/400_0730483320d1.jpg",
"filename": "400_0730483320d1.jpg",
"imageHash": "bb7357581a39fdbdddadbe6c0f569d3b",
"price": 15.99,
"name": "Gorgeous Animal Mug",
"description": "rerum consectetur magni sed enim eveniet et dolorem laudantium ut aut qui voluptatem praesentium soluta iste aliquid dolorem quibusdam veniam voluptas quaerat excepturi",
"slug": "Gorgeous-Animal-Mug",
"added": 1481333026774,
"manufacturer": "Hodkiewicz-Inc",
"itemType": "mug",
"productImg": "mug-400_0730483320d1.jpg"
},
{
"imageCredit": {
"artist": "Zwaddi",
"link": "http://www.resplashed.com/photographer/zwaddi/"
},
"tags": [
"Machine",
"Ocean"
],
"imageUrl": "http://www.resplashed.com/img/400_073a882ab243.jpg",
"filename": "400_073a882ab243.jpg",
"imageHash": "39eeffa4ff1219207fbc62f5ddde53c7",
"price": 13.99,
"name": "Ergonomic Machine Mug",
"description": "minus nihil ipsum explicabo pariatur adipisci harum quia ab et voluptate odio",
"slug": "Ergonomic-Machine-Mug",
"added": 1481307879405,
"manufacturer": "Nikolaus-Schinner",
"itemType": "mug",
"productImg": "mug-400_073a882ab243.jpg"
},
{
"imageCredit": {
"artist": "Jacob Valerio",
"link": "http://www.resplashed.com/photographer/jacob_valerio/"
},
"tags": [
"Planes",
"Sun",
"Clouds"
],
"imageUrl": "http://www.resplashed.com/img/400_080179bbc3fb.jpg",
"filename": "400_080179bbc3fb.jpg",
"imageHash": "0be8db2f83cce06ae8d20d982e42b66c",
"price": 15.99,
"name": "Licensed Clouds Mug",
"description": "maiores esse culpa qui fuga dignissimos officia aliquid perferendis consequatur possimus accusantium",
"slug": "Licensed-Clouds-Mug",
"added": 1481505340969,
"manufacturer": "Boyle-LLC",
"itemType": "mug",
"productImg": "mug-400_080179bbc3fb.jpg"
},
{
"imageCredit": {
"artist": "Zwaddi",
"link": "http://www.resplashed.com/photographer/zwaddi/"
},
"tags": [
"Beach",
"Television",
"Tv"
],
"imageUrl": "http://www.resplashed.com/img/400_089259cc2e9b.jpg",
"filename": "400_089259cc2e9b.jpg",
"imageHash": "f8f34b734312538fafbf7ca7775fb6bb",
"price": 11.99,
"name": "Awesome Television Mug",
"description": "tenetur perspiciatis necessitatibus eligendi perspiciatis et facilis expedita reiciendis et in corporis nostrum quam molestiae voluptatum soluta consequuntur nemo totam magnam doloremque adipisci architecto",
"slug": "Awesome-Television-Mug",
"added": 1483267004259,
"manufacturer": "Dickens-Franecki",
"itemType": "mug",
"productImg": "mug-400_089259cc2e9b.jpg"
},
{
"imageCredit": {
"artist": "Nigel Lo",
"link": "http://www.resplashed.com/photographer/nigel_lo/"
},
"tags": [
"Grass",
"Meadow",
"Plants"
],
"imageUrl": "http://www.resplashed.com/img/400_0965288ccf03.jpg",
"filename": "400_0965288ccf03.jpg",
"imageHash": "aeb4169bf705afae595b2ccdf0f1c0c2",
"price": 11.99,
"name": "Fantastic Grass Mug",
"description": "quod voluptas porro animi et praesentium velit aperiam ut officiis ut praesentium perspiciatis quia iste molestias voluptas",
"slug": "Fantastic-Grass-Mug",
"added": 1483834365140,
"manufacturer": "Boyle-LLC",
"itemType": "mug",
"productImg": "mug-400_0965288ccf03.jpg"
},
{
"imageCredit": {
"artist": "sam",
"link": "http://www.resplashed.com/photographer/sam/"
},
"tags": [
"People"
],
"imageUrl": "http://www.resplashed.com/img/400_0969cc43060c.jpg",
"filename": "400_0969cc43060c.jpg",
"imageHash": "f25bfe9910ab1c048ec846467a4c74da",
"price": 13.99,
"name": "Refined People Mug",
"description": "sequi aliquam sapiente quibusdam fugit consequuntur voluptatum sint reprehenderit est mollitia voluptas consequatur similique quibusdam dolorem rerum quis",
"slug": "Refined-People-Mug",
"added": 1482852590065,
"manufacturer": "Bayer-and-Sons",
"itemType": "mug",
"productImg": "mug-400_0969cc43060c.jpg"
},
{
"imageCredit": {
"artist": "Ma. Alejandra G",
"link": "http://www.resplashed.com/photographer/ma._alejandra_g/"
},
"tags": [
"Beach",
"Ocean"
],
"imageUrl": "http://www.resplashed.com/img/400_0a386dd2f7b1.jpg",
"filename": "400_0a386dd2f7b1.jpg",
"imageHash": "d6446b5bd637a1076fbacd979eb0076a",
"price": 13.99,
"name": "Practical Beach Mug",
"description": "dolorum quam nulla assumenda harum expedita est animi possimus a quod repellendus doloribus quae a in praesentium ut voluptatem quae esse consectetur et",
"slug": "Practical-Beach-Mug",
"added": 1483847156817,
"manufacturer": "Hodkiewicz-Inc",
"itemType": "mug",
"productImg": "mug-400_0a386dd2f7b1.jpg"
},
{
"imageCredit": {
"artist": "Christopher Skor",
"link": "http://www.resplashed.com/photographer/christopher_skor/"
},
"tags": [
"American",
"Sky",
"Patriotic",
"Flag"
],
"imageUrl": "http://www.resplashed.com/img/400_0a4d3ca524ea.jpg",
"filename": "400_0a4d3ca524ea.jpg",
"imageHash": "4a1ca3e7b37e1c3a8f1da9a5f42e95f3",
"price": 13.99,
"name": "Intelligent Patriotic Mug",
"description": "perspiciatis quia animi maxime modi non molestiae ab voluptas modi molestias non et sed repudiandae iste accusamus autem",
"slug": "Intelligent-Patriotic-Mug",
"added": 1479597182568,
"manufacturer": "Bayer-and-Sons",
"itemType": "mug",
"productImg": "mug-400_0a4d3ca524ea.jpg"
},
{
"imageCredit": {
"artist": "Jeff Sheldon",
"link": "http://www.resplashed.com/photographer/jeff_sheldon/"
},
"tags": [
"Desk",
"Office",
"Wood"
],
"imageUrl": "http://www.resplashed.com/img/400_0a5541b8888d.jpg",
"filename": "400_0a5541b8888d.jpg",
"imageHash": "f2e4dc3e6f1d7c7ed0f4f0f5ecde3a46",
"price": 16.99,
"name": "Unbranded Office Mug",
"description": "et qui sint modi expedita similique consequatur esse quis aliquam est aliquam architecto quidem rerum nihil",
"slug": "Unbranded-Office-Mug",
"added": 1481770180832,
"manufacturer": "Lowe-Wunsch-and-Stoltenberg",
"itemType": "mug",
"productImg": "mug-400_0a5541b8888d.jpg"
},
{
"imageCredit": {
"artist": "Jean-Marie Grange",
"link": "http://www.resplashed.com/photographer/jean-marie_grange/"
},
"tags": [
"City",
"Building"
],
"imageUrl": "http://www.resplashed.com/img/400_0b1a368eb748.jpg",
"filename": "400_0b1a368eb748.jpg",
"imageHash": "22165803b4df2ea0de9033b61d015ef9",
"price": 10.99,
"name": "Awesome City Mug",
"description": "sint voluptatem accusantium quae facilis ipsum numquam ut possimus eveniet quia autem repudiandae ipsa qui ratione molestiae id voluptatem sit",
"slug": "Awesome-City-Mug",
"added": 1479130102615,
"manufacturer": "Oberbrunner-Block-and-Mills",
"itemType": "mug",
"productImg": "mug-400_0b1a368eb748.jpg"
},
{
"imageCredit": {
"artist": "André Freitas",
"link": "http://www.resplashed.com/photographer/andr%C3%A9_freitas/"
},
"tags": [
"Mugs",
"Coffee",
"Wood"
],
"imageUrl": "http://www.resplashed.com/img/400_0b9d791fbfbc.jpg",
"filename": "400_0b9d791fbfbc.jpg",
"imageHash": "1815d77a53927677c53d86d0f416b955",
"price": 9.99,
"name": "Incredible Coffee Mug",
"description": "mollitia nostrum sequi aperiam quia nostrum aliquam expedita sint sit voluptatibus incidunt officia illum est doloribus",
"slug": "Incredible-Coffee-Mug",
"added": 1485255015871,
"manufacturer": "McCullough---Lueilwitz",
"itemType": "mug",
"productImg": "mug-400_0b9d791fbfbc.jpg"
},
{
"imageCredit": {
"artist": "Anders Jildén",
"link": "http://www.resplashed.com/photographer/anders_jild%C3%A9n/"
},
"tags": [
"Tree",
"Plant",
"Flowers"
],
"imageUrl": "http://www.resplashed.com/img/400_0bbf7812da25.jpg",
"filename": "400_0bbf7812da25.jpg",
"imageHash": "4fc40ce60eef41ab18c80f748879e9f9",
"price": 10.99,
"name": "Gorgeous Tree Mug",
"description": "ut enim et odit inventore sunt eos culpa incidunt laudantium magnam veniam sequi consequatur quia recusandae unde et incidunt quod et a",
"slug": "Gorgeous-Tree-Mug",
"added": 1477784601773,
"manufacturer": "Rice-Inc",
"itemType": "mug",
"productImg": "mug-400_0bbf7812da25.jpg"
},
{
"imageCredit": {
"artist": "Piotr Kwiatkowski",
"link": "http://www.resplashed.com/photographer/piotr_kwiatkowski/"
},
"tags": [
"Metal",
"Bridge",
"People"
],
"imageUrl": "http://www.resplashed.com/img/400_0be9d43a03cc.jpg",
"filename": "400_0be9d43a03cc.jpg",
"imageHash": "4b89c1588e23fc29c9a9369b1036a5ed",
"price": 17.99,
"name": "Fantastic Metal Mug",
"description": "qui minima et quibusdam accusantium facere doloribus culpa rerum eum accusamus nam",
"slug": "Fantastic-Metal-Mug",
"added": 1479359688647,
"manufacturer": "Boyle-LLC",
"itemType": "mug",
"productImg": "mug-400_0be9d43a03cc.jpg"
},
{
"imageCredit": {
"artist": "Alex Siale",
"link": "http://www.resplashed.com/photographer/alex_siale/"
},
"tags": [
"Nature",
"Ocean",
"Hillside"
],
"imageUrl": "http://www.resplashed.com/img/400_0c3a80d9f650.jpg",
"filename": "400_0c3a80d9f650.jpg",
"imageHash": "54ee68f3c87cf83f863ab53729145165",
"price": 14.99,
"name": "Licensed Hillside Mug",
"description": "ex corrupti vel esse perferendis non similique at quia voluptatem sit illo ut maiores et magni",
"slug": "Licensed-Hillside-Mug",
"added": 1485195149049,
"manufacturer": "Lowe-Wunsch-and-Stoltenberg",
"itemType": "mug",
"productImg": "mug-400_0c3a80d9f650.jpg"
},
{
"imageCredit": {
"artist": "Zwaddi",
"link": "http://www.resplashed.com/photographer/zwaddi/"
},
"tags": [
"Person",
"Raindrops",
"Hand"
],
"imageUrl": "http://www.resplashed.com/img/400_0c45f4b6518b.jpg",
"filename": "400_0c45f4b6518b.jpg",
"imageHash": "37d1bcc647554a153568000888046784",
"price": 10.99,
"name": "Intelligent Person Mug",
"description": "necessitatibus voluptas rerum ea ea pariatur aut enim nam voluptas voluptatem maxime dignissimos",
"slug": "Intelligent-Person-Mug",
"added": 1480379459639,
"manufacturer": "Bayer-and-Sons",
"itemType": "mug",
"productImg": "mug-400_0c45f4b6518b.jpg"
},
{
"imageCredit": {
"artist": "Geoffrey Arduini",
"link": "http://www.resplashed.com/photographer/geoffrey_arduini/"
},
"tags": [
"Snow",
"Chair lift",
"Ski",
"Snowboard",
"Mountain"
],
"imageUrl": "http://www.resplashed.com/img/400_0c52c54f2ffe.jpg",
"filename": "400_0c52c54f2ffe.jpg",
"imageHash": "525558b7e243e22e59355cb2023b10cd",
"price": 17.99,
"name": "Small Snow Mug",
"description": "laboriosam delectus accusamus aut aspernatur optio natus necessitatibus eos voluptas ut excepturi alias qui non et dolor in sint esse reprehenderit veniam consequatur",
"slug": "Small-Snow-Mug",
"added": 1486327799048,
"manufacturer": "Bayer-and-Sons",
"itemType": "mug",
"productImg": "mug-400_0c52c54f2ffe.jpg"
},
{
"imageCredit": {
"artist": "Oliver & Hen Pritchard-Barrett",
"link": "http://www.resplashed.com/photographer/oliver_%26_hen_pritchard-barrett/"
},
"tags": [
"Ocean",
"Waves"
],
"imageUrl": "http://www.resplashed.com/img/400_0c6f9f881f92.jpg",
"filename": "400_0c6f9f881f92.jpg",
"imageHash": "2b6a80b2c064a6c068754f5602fd7169",
"price": 17.99,
"name": "Intelligent Waves Mug",
"description": "aliquam odit iure porro facere ea adipisci laboriosam eligendi qui commodi officiis quia beatae dolorem ducimus aut et",
"slug": "Intelligent-Waves-Mug-1",
"added": 1479103379933,
"manufacturer": "Leuschke-Smith-and-Conroy",
"itemType": "mug",
"productImg": "mug-400_0c6f9f881f92.jpg"
},
{
"imageCredit": {
"artist": "Zwaddi",
"link": "http://www.resplashed.com/photographer/zwaddi/"
},
"tags": [
"Snow",
"Person",
"Reflection"
],
"imageUrl": "http://www.resplashed.com/img/400_0c86088784fd.jpg",
"filename": "400_0c86088784fd.jpg",
"imageHash": "5b83d7319b98f0064ca749fe8a00653f",
"price": 12.99,
"name": "Licensed Person Mug",
"description": "inventore ut dolores facilis soluta excepturi necessitatibus saepe et expedita omnis omnis nihil eos dignissimos harum sequi aliquid sed voluptatem illum porro",
"slug": "Licensed-Person-Mug",
"added": 1483379331438,
"manufacturer": "Metz---Kautzer",
"itemType": "mug",
"productImg": "mug-400_0c86088784fd.jpg"
},
{
"imageCredit": {
"artist": "Liam Andrew Cura",
"link": "http://www.resplashed.com/photographer/liam_andrew_cura/"
},
"tags": [
"Buildings",
"City"
],
"imageUrl": "http://www.resplashed.com/img/400_0ce2f1eedaab.jpg",
"filename": "400_0ce2f1eedaab.jpg",
"imageHash": "dc30fe53768eeecc76afe4a455959b7f",
"price": 20.99,
"name": "Handcrafted City Mug",
"description": "omnis nemo nisi praesentium cumque a est dolore distinctio porro asperiores ut non officia hic aut velit deleniti et nihil",
"slug": "Handcrafted-City-Mug",
"added": 1486194521970,
"manufacturer": "Bernier-Hane",
"itemType": "mug",
"productImg": "mug-400_0ce2f1eedaab.jpg"
},
{
"imageCredit": {
"artist": "Alexander Rotker",
"link": "http://www.resplashed.com/photographer/alexander_rotker/"
},
"tags": [
"Bridge",
"City"
],
"imageUrl": "http://www.resplashed.com/img/400_0d222f6aaeba.jpg",
"filename": "400_0d222f6aaeba.jpg",
"imageHash": "0f3f6be5402351c62b75e60e5c8c52b4",
"price": 15.99,
"name": "Intelligent Bridge Mug",
"description": "molestiae nostrum aliquid odit omnis id perspiciatis iure ut aperiam suscipit dolores",
"slug": "Intelligent-Bridge-Mug",
"added": 1484796278055,
"manufacturer": "Metz---Kautzer",
"itemType": "mug",
"productImg": "mug-400_0d222f6aaeba.jpg"
},
{
"imageCredit": {
"artist": "davide ragusa",
"link": "http://www.resplashed.com/photographer/davide_ragusa/"
},
"tags": [
"Architecture",
"Italy",
"Building"
],
"imageUrl": "http://www.resplashed.com/img/400_0d4cdf3af4bd.jpg",
"filename": "400_0d4cdf3af4bd.jpg",
"imageHash": "717df03e42a3925fc88d47b5b2c04612",
"price": 19.99,
"name": "Refined Building Mug",
"description": "et dolorum rerum provident nobis ipsam delectus qui et cupiditate est aut et",
"slug": "Refined-Building-Mug",
"added": 1485727487020,
"manufacturer": "Feil-Dooley-and-Reinger",
"itemType": "mug",
"productImg": "mug-400_0d4cdf3af4bd.jpg"
},
{
"imageCredit": {
"artist": "Drew Collins",
"link": "http://www.resplashed.com/photographer/drew_collins/"
},
"tags": [
"Sky",
"Night",
"Stars"
],
"imageUrl": "http://www.resplashed.com/img/400_0dc97e4f278b.jpg",
"filename": "400_0dc97e4f278b.jpg",
"imageHash": "071d989c40f8ae491029108bc65819e5",
"price": 18.99,
"name": "Practical Stars Mug",
"description": "fugit facere facilis laborum rerum culpa nulla nesciunt et ex error unde",
"slug": "Practical-Stars-Mug",
"added": 1483437823499,
"manufacturer": "Heathcote-Kautzer-and-Turner",
"itemType": "mug",
"productImg": "mug-400_0dc97e4f278b.jpg"
},
{
"imageCredit": {
"artist": "Zwaddi",
"link": "http://www.resplashed.com/photographer/zwaddi/"
},
"tags": [
"Fog",
"Forest"
],
"imageUrl": "http://www.resplashed.com/img/400_0e33407e3d59.jpg",
"filename": "400_0e33407e3d59.jpg",
"imageHash": "e6c5dbceb9aa800f8961176b17d97bdb",
"price": 10.99,
"name": "Small Forest Mug",
"description": "doloribus est odio nam magnam sed alias vitae sed non voluptates necessitatibus optio id voluptatem laborum aperiam quia est mollitia repellat accusamus",
"slug": "Small-Forest-Mug",
"added": 1480056059539,
"manufacturer": "Konopelski-Inc",
"itemType": "mug",
"productImg": "mug-400_0e33407e3d59.jpg"
}
]
}
\ No newline at end of file
{"added":1485723766805,"description":"enim corporis voluptatibus laudantium possimus alias dolorem voluptatem similique aut aliquam voluptatem voluptatem omnis id consequatur","filename":"400_002e1ecb8bd2.jpg","imageCredit":{"artist":"Martin Wessely","link":"http://www.resplashed.com/photographer/martin_wessely/"},"imageHash":"2b1d5b5ef4b37b4f5d0dccade1b69987","imageUrl":"http://www.resplashed.com/img/400_002e1ecb8bd2.jpg","itemType":"mug","manufacturer":"OHara-Group","name":"Handcrafted Trees Mug","price":10.99,"productImg":"mug-400_002e1ecb8bd2.jpg","slug":"Handcrafted-Trees-Mug","tags":["Trees"]}
v1
{"nextBatchWatermarkMs":0}
\ No newline at end of file
{"id":"0f6e3ac4-360a-43f1-a92f-a99285b9bfcd"}
\ No newline at end of file
v1
{"batchWatermarkMs":0,"batchTimestampMs":1686752099801,"conf":{"spark.sql.streaming.stateStore.providerClass":"org.apache.spark.sql.execution.streaming.state.HDFSBackedStateStoreProvider","spark.sql.streaming.join.stateFormatVersion":"2","spark.sql.streaming.stateStore.compression.codec":"lz4","spark.sql.streaming.stateStore.rocksdb.formatVersion":"5","spark.sql.streaming.flatMapGroupsWithState.stateFormatVersion":"2","spark.sql.streaming.multipleWatermarkPolicy":"min","spark.sql.streaming.aggregation.stateFormatVersion":"2","spark.sql.shuffle.partitions":"200"}}
{"test-inventory2":{"0":2}}
\ No newline at end of file
v1
{"nextBatchWatermarkMs":0}
\ No newline at end of file
{"id":"60f5933f-85d3-4135-bc9f-f20f13af463b"}
\ No newline at end of file
v1
{"batchWatermarkMs":0,"batchTimestampMs":1686752058281,"conf":{"spark.sql.streaming.stateStore.providerClass":"org.apache.spark.sql.execution.streaming.state.HDFSBackedStateStoreProvider","spark.sql.streaming.join.stateFormatVersion":"2","spark.sql.streaming.stateStore.compression.codec":"lz4","spark.sql.streaming.stateStore.rocksdb.formatVersion":"5","spark.sql.streaming.flatMapGroupsWithState.stateFormatVersion":"2","spark.sql.streaming.multipleWatermarkPolicy":"min","spark.sql.streaming.aggregation.stateFormatVersion":"2","spark.sql.shuffle.partitions":"200"}}
{"logOffset":0}
\ No newline at end of file
v1
{"path":"file:///D:/Work/events/inventory-process-api/src/main/resources/data/194409539/inventory_sample.json","timestamp":1686752049545,"batchId":0}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment