From 50e848b84f8b88dbccaf6527b97667b989924ea2 Mon Sep 17 00:00:00 2001 From: Ricardo Portilla Date: Tue, 10 Aug 2021 12:19:02 -0400 Subject: [PATCH 01/39] new changes --- python/tempo/resample.py | 39 ++++++++++++++++-- python/tempo/tsdf.py | 14 +++---- python/tests/tests.py | 87 +++++++++++++++++++++++++++++++++++++++- 3 files changed, 128 insertions(+), 12 deletions(-) diff --git a/python/tempo/resample.py b/python/tempo/resample.py index 78d373e9..55a1257c 100644 --- a/python/tempo/resample.py +++ b/python/tempo/resample.py @@ -1,4 +1,7 @@ import pyspark.sql.functions as f +from datetime import * +from pyspark.sql.types import * +from pyspark.sql.window import Window # define global frequency options import tempo @@ -24,16 +27,16 @@ def __appendAggKey(tsdf, freq = None): """ :param tsdf: TSDF object as input :param freq: frequency at which to upsample - :return: return a TSDF with a new aggregate key (called agg_key) + :return: triple - 1) return a TSDF with a new aggregate key (called agg_key) 2) return the period for use in interpolation, 3) return the time increment (also necessary for interpolation) """ df = tsdf.df parsed_freq = checkAllowableFreq(tsdf, freq) agg_window = f.window(f.col(tsdf.ts_col), "{} {}".format(parsed_freq[0], freq_dict[parsed_freq[1]])) df = df.withColumn("agg_key", agg_window) - return tempo.TSDF(df, tsdf.ts_col, partition_cols = tsdf.partitionCols) + return (tempo.TSDF(df, tsdf.ts_col, partition_cols = tsdf.partitionCols), parsed_freq[0], freq_dict[parsed_freq[1]]) -def aggregate(tsdf, freq, func, metricCols = None, prefix = None): +def aggregate(tsdf, freq, func, metricCols = None, prefix = None, fill = None): """ aggregate a data frame by a coarser timestamp than the initial TSDF ts_col :param tsdf: input TSDF object @@ -41,7 +44,7 @@ def aggregate(tsdf, freq, func, metricCols = None, prefix = None): :param metricCols: columns used for aggregates :return: TSDF object with newly aggregated timestamp as ts_col with aggregated values """ - tsdf = __appendAggKey(tsdf, freq) + tsdf, period, unit = __appendAggKey(tsdf, freq) df = tsdf.df groupingCols = tsdf.partitionCols + ['agg_key'] @@ -94,6 +97,34 @@ def aggregate(tsdf, freq, func, metricCols = None, prefix = None): non_part_cols = set(set(res.columns) - set(tsdf.partitionCols)) - set([tsdf.ts_col]) sel_and_sort = tsdf.partitionCols + [tsdf.ts_col] + sorted(non_part_cols) res = res.select(sel_and_sort) + + min_time = df.select(f.min(f.col(tsdf.ts_col))).collect()[0][0] + max_time = df.select(f.max(f.col(tsdf.ts_col))).collect()[0][0] + + difference = (max_time - min_time) + + seconds = difference.total_seconds() + + days = int(seconds // 24) + hours = int(seconds // 3600) + minutes = int((seconds % 3600) // 60) + seconds = int(seconds % 60) + + fillW = Window.partitionBy(tsdf.partitionCols) + + imputes = tsdf.df.select(*tsdf.partitionCols, f.min(tsdf.ts_col).over(fillW).alias("from"), f.max(tsdf.ts_col).over(fillW).alias("until")) \ + .distinct() \ + .withColumn(tsdf.ts_col, f.explode(f.expr("sequence(from, until, interval {} {})".format(period, unit)))) \ + .drop("from", "until") + + metrics = [] + for col in tsdf.df.dtypes: + if col[1] in ('long', 'double', 'decimal', 'integer'): + metrics.append(col[0]) + + if (fill): + res = imputes.join(res, tsdf.partitionCols + [tsdf.ts_col], "leftouter").na.fill(0, metrics) + return(tempo.TSDF(res, ts_col = tsdf.ts_col, partition_cols = tsdf.partitionCols)) diff --git a/python/tempo/tsdf.py b/python/tempo/tsdf.py index df3cc36c..d6e11964 100644 --- a/python/tempo/tsdf.py +++ b/python/tempo/tsdf.py @@ -429,7 +429,7 @@ def withRangeStats(self, type='range', colsToSummarize=[], rangeBackWindowSecs=1 def write(self, spark, tabName, optimizationCols = None): tio.write(self, spark, tabName, optimizationCols) - def resample(self, freq, func=None, metricCols = None, prefix=None): + def resample(self, freq, func=None, metricCols = None, prefix=None, fill = None): """ function to upsample based on frequency and aggregate function similar to pandas :param freq: frequency for upsample - valid inputs are "hr", "min", "sec" corresponding to hour, minute, or second @@ -437,15 +437,15 @@ def resample(self, freq, func=None, metricCols = None, prefix=None): :return: TSDF object with sample data using aggregate function """ rs.validateFuncExists(func) - enriched_tsdf = rs.aggregate(self, freq, func, metricCols, prefix) + enriched_tsdf = rs.aggregate(self, freq, func, metricCols, prefix, fill) return(enriched_tsdf) - def calc_bars(tsdf, freq, func = None, metricCols = None): + def calc_bars(tsdf, freq, func = None, metricCols = None, fill = None): - resample_open = tsdf.resample(freq=freq, func='floor', metricCols = metricCols, prefix='open') - resample_low = tsdf.resample(freq=freq, func='min', metricCols = metricCols, prefix='low') - resample_high = tsdf.resample(freq=freq, func='max', metricCols = metricCols, prefix='high') - resample_close = tsdf.resample(freq=freq, func='ceil', metricCols = metricCols, prefix='close') + resample_open = tsdf.resample(freq=freq, func='floor', metricCols = metricCols, prefix='open', fill = fill) + resample_low = tsdf.resample(freq=freq, func='min', metricCols = metricCols, prefix='low', fill = fill) + resample_high = tsdf.resample(freq=freq, func='max', metricCols = metricCols, prefix='high', fill = fill) + resample_close = tsdf.resample(freq=freq, func='ceil', metricCols = metricCols, prefix='close', fill = fill) join_cols = resample_open.partitionCols + [resample_open.ts_col] bars = resample_open.df.join(resample_high.df, join_cols).join(resample_low.df, join_cols).join(resample_close.df, join_cols) diff --git a/python/tests/tests.py b/python/tests/tests.py index eebba681..94061d9e 100644 --- a/python/tests/tests.py +++ b/python/tests/tests.py @@ -372,7 +372,7 @@ def test_range_stats(self): class ResampleTest(SparkTest): - def test_upsample(self): + def test_resample(self): """Test of range stats for 20 minute rolling window""" schema = StructType([StructField("symbol", StringType()), StructField("date", StringType()), @@ -451,6 +451,91 @@ def test_upsample(self): self.assertDataFramesEqual(featured_df, dfExpected) self.assertDataFramesEqual(resample_30m, expected_30s_df) + #test bars summary + self.assertDataFramesEqual(bars, barsExpected) + + def test_upsample(self): + """Test of range stats for 20 minute rolling window""" + schema = StructType([StructField("symbol", StringType()), + StructField("date", StringType()), + StructField("event_ts", StringType()), + StructField("trade_pr", FloatType()), + StructField("trade_pr_2", FloatType())]) + + expectedSchema = StructType([StructField("symbol", StringType()), + StructField("event_ts", StringType()), + StructField("floor_trade_pr", FloatType()), + StructField("floor_date", StringType()), + StructField("floor_trade_pr_2", FloatType())]) + + expected_30m_Schema = StructType([StructField("symbol", StringType()), + StructField("event_ts", StringType()), + StructField("date", DoubleType()), + StructField("trade_pr", DoubleType()), + StructField("trade_pr_2", DoubleType())]) + + expectedBarsSchema = StructType([StructField("symbol", StringType()), + StructField("event_ts", StringType()), + StructField("close_trade_pr", FloatType()), + StructField("close_trade_pr_2", FloatType()), + StructField("high_trade_pr", FloatType()), + StructField("high_trade_pr_2", FloatType()), + StructField("low_trade_pr", FloatType()), + StructField("low_trade_pr_2", FloatType()), + StructField("open_trade_pr", FloatType()), + StructField("open_trade_pr_2", FloatType())]) + + data = [["S1", "SAME_DT", "2020-08-01 00:00:10", 349.21, 10.0], + ["S1", "SAME_DT", "2020-08-01 00:00:11", 340.21, 9.0], + ["S1", "SAME_DT", "2020-08-01 00:01:12", 353.32, 8.0], + ["S1", "SAME_DT", "2020-08-01 00:01:13", 351.32, 7.0], + ["S1", "SAME_DT", "2020-08-01 00:01:14", 350.32, 6.0], + ["S1", "SAME_DT", "2020-09-01 00:01:12", 361.1, 5.0], + ["S1", "SAME_DT","2020-09-01 00:19:12", 362.1, 4.0]] + + expected_data = [ + ["S1", "2020-08-01 00:00:00", 349.21, "SAME_DT", 10.0], + ["S1", "2020-08-01 00:01:00", 353.32, "SAME_DT", 8.0], + ["S1", "2020-09-01 00:01:00", 361.1, "SAME_DT", 5.0], + ["S1", "2020-09-01 00:19:00", 362.1, "SAME_DT", 4.0]] + + expected_data_30m = [ + ["S1", "2020-08-01 00:00:00", None, 348.88, 8.0], + ["S1", "2020-09-01 00:00:00", None, 361.1, 5.0], + ["S1", "2020-09-01 00:15:00", None, 362.1, 4.0] + ] + + expected_bars = [ + ['S1', '2020-08-01 00:00:00', 340.21, 9.0, 349.21, 10.0, 340.21, 9.0, 349.21, 10.0], + ['S1', '2020-08-01 00:01:00', 350.32, 6.0, 353.32, 8.0, 350.32, 6.0, 353.32, 8.0], + ['S1', '2020-09-01 00:01:00', 361.1, 5.0, 361.1, 5.0, 361.1, 5.0, 361.1, 5.0], + ['S1', '2020-09-01 00:19:00', 362.1, 4.0, 362.1, 4.0, 362.1, 4.0, 362.1, 4.0] + ] + + # construct dataframes + df = self.buildTestDF(schema,data) + dfExpected = self.buildTestDF(expectedSchema,expected_data) + expected_30s_df = self.buildTestDF(expected_30m_Schema,expected_data_30m) + barsExpected = self.buildTestDF(expectedBarsSchema,expected_bars) + + + # convert to TSDF + tsdf_left = TSDF(df, partition_cols=["symbol"]) + + + resample_30m = tsdf_left.resample(freq = "5 minutes", func = "mean", fill = True).df.withColumn("trade_pr", F.round(F.col('trade_pr'), 2)) + + bars = tsdf_left.calc_bars(freq='min', metricCols = ['trade_pr', 'trade_pr_2'], fill = True).df + + print('resample 30 min') + resample_30m.show(10, False) + print('expected 30s df') + expected_30s_df.show(10, False) + + # should be equal to the expected dataframe + self.assertDataFramesEqual(resample_30m, expected_30s_df) + + #test bars summary self.assertDataFramesEqual(bars, barsExpected) From 30492b511f6c992e857e264ce14c92a7ef3a9c3a Mon Sep 17 00:00:00 2001 From: Ricardo Portilla Date: Thu, 12 Aug 2021 17:14:58 -0400 Subject: [PATCH 02/39] updated upsample --- python/tempo/resample.py | 21 ++++++++++++++++----- python/tests/tests.py | 24 +++++++++--------------- 2 files changed, 25 insertions(+), 20 deletions(-) diff --git a/python/tempo/resample.py b/python/tempo/resample.py index 55a1257c..529d30a6 100644 --- a/python/tempo/resample.py +++ b/python/tempo/resample.py @@ -98,9 +98,20 @@ def aggregate(tsdf, freq, func, metricCols = None, prefix = None, fill = None): sel_and_sort = tsdf.partitionCols + [tsdf.ts_col] + sorted(non_part_cols) res = res.select(sel_and_sort) - min_time = df.select(f.min(f.col(tsdf.ts_col))).collect()[0][0] + min_time = res.select(f.min(f.col(tsdf.ts_col))).collect()[0][0] max_time = df.select(f.max(f.col(tsdf.ts_col))).collect()[0][0] + if (freq == HR): + min_time = min_time - timedelta(hours=min_time.hour % period, minutes=min_time.minute, seconds=min_time.second, + microseconds=min_time.microsecond) + elif freq == MIN: + min_time = min_time - timedelta(minutes=min_time.minute % period, seconds=min_time.second, + microseconds=min_time.microsecond) + elif freq == SEC: + min_time = min_time - timedelta(seconds=min_time.second % period, microseconds=min_time.microsecond) + elif freq == DAY: + min_time = min_time - timedelta(days=min_time.day % period, hours = min_time.hour, minutes=min_time.minute, seconds=min_time.second, microseconds=min_time.microsecond) + difference = (max_time - min_time) seconds = difference.total_seconds() @@ -112,17 +123,17 @@ def aggregate(tsdf, freq, func, metricCols = None, prefix = None, fill = None): fillW = Window.partitionBy(tsdf.partitionCols) - imputes = tsdf.df.select(*tsdf.partitionCols, f.min(tsdf.ts_col).over(fillW).alias("from"), f.max(tsdf.ts_col).over(fillW).alias("until")) \ + imputes = res.select(*tsdf.partitionCols, f.min(tsdf.ts_col).over(fillW).alias("from"), f.max(tsdf.ts_col).over(fillW).alias("until")) \ .distinct() \ .withColumn(tsdf.ts_col, f.explode(f.expr("sequence(from, until, interval {} {})".format(period, unit)))) \ .drop("from", "until") metrics = [] - for col in tsdf.df.dtypes: - if col[1] in ('long', 'double', 'decimal', 'integer'): + for col in res.dtypes: + if col[1] in ['long', 'double', 'decimal', 'integer', 'float']: metrics.append(col[0]) - if (fill): + if fill: res = imputes.join(res, tsdf.partitionCols + [tsdf.ts_col], "leftouter").na.fill(0, metrics) return(tempo.TSDF(res, ts_col = tsdf.ts_col, partition_cols = tsdf.partitionCols)) diff --git a/python/tests/tests.py b/python/tests/tests.py index 94061d9e..5e477de8 100644 --- a/python/tests/tests.py +++ b/python/tests/tests.py @@ -53,7 +53,7 @@ def assertFieldsEqual(self, fieldA, fieldB): """ self.assertEqual(fieldA.name.lower(), fieldB.name.lower()) self.assertEqual(fieldA.dataType, fieldB.dataType) - self.assertEqual(fieldA.nullable, fieldB.nullable) + #self.assertEqual(fieldA.nullable, fieldB.nullable) def assertSchemaContainsField(self, schema, field): """ @@ -387,7 +387,7 @@ def test_resample(self): StructField("floor_trade_pr_2", FloatType())]) expected_30m_Schema = StructType([StructField("symbol", StringType()), - StructField("event_ts", StringType()), + StructField("event_ts", StringType(), True), StructField("date", DoubleType()), StructField("trade_pr", DoubleType()), StructField("trade_pr_2", DoubleType())]) @@ -500,9 +500,10 @@ def test_upsample(self): ["S1", "2020-09-01 00:19:00", 362.1, "SAME_DT", 4.0]] expected_data_30m = [ - ["S1", "2020-08-01 00:00:00", None, 348.88, 8.0], - ["S1", "2020-09-01 00:00:00", None, 361.1, 5.0], - ["S1", "2020-09-01 00:15:00", None, 362.1, 4.0] + ["S1", "2020-08-01 00:00:00", 0.0, 348.88, 8.0], + ["S1", "2020-08-01 00:05:00", 0.0, 0.0, 0.0], + ["S1", "2020-09-01 00:00:00", 0.0, 361.1, 5.0], + ["S1", "2020-09-01 00:15:00", 0.0, 362.1, 4.0] ] expected_bars = [ @@ -518,23 +519,16 @@ def test_upsample(self): expected_30s_df = self.buildTestDF(expected_30m_Schema,expected_data_30m) barsExpected = self.buildTestDF(expectedBarsSchema,expected_bars) - # convert to TSDF tsdf_left = TSDF(df, partition_cols=["symbol"]) resample_30m = tsdf_left.resample(freq = "5 minutes", func = "mean", fill = True).df.withColumn("trade_pr", F.round(F.col('trade_pr'), 2)) - bars = tsdf_left.calc_bars(freq='min', metricCols = ['trade_pr', 'trade_pr_2'], fill = True).df - - print('resample 30 min') - resample_30m.show(10, False) - print('expected 30s df') - expected_30s_df.show(10, False) - - # should be equal to the expected dataframe - self.assertDataFramesEqual(resample_30m, expected_30s_df) + bars = tsdf_left.calc_bars(freq='min', metricCols = ['trade_pr', 'trade_pr_2']).df + upsampled = resample_30m.filter(F.col("event_ts").isin('2020-08-01 00:00:00', '2020-08-01 00:05:00', '2020-09-01 00:00:00', '2020-09-01 00:15:00')) + self.assertDataFramesEqual(upsampled, expected_30s_df) #test bars summary self.assertDataFramesEqual(bars, barsExpected) From 0980ad05dddf1d261bc2a2486ae34391ff8b5296 Mon Sep 17 00:00:00 2001 From: Ricardo Portilla Date: Thu, 12 Aug 2021 17:25:11 -0400 Subject: [PATCH 03/39] updated upsample --- python/tempo/resample.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/tempo/resample.py b/python/tempo/resample.py index 529d30a6..bc11dde9 100644 --- a/python/tempo/resample.py +++ b/python/tempo/resample.py @@ -130,7 +130,7 @@ def aggregate(tsdf, freq, func, metricCols = None, prefix = None, fill = None): metrics = [] for col in res.dtypes: - if col[1] in ['long', 'double', 'decimal', 'integer', 'float']: + if col[1] in ['long', 'double', 'decimal', 'integer', 'float', 'int']: metrics.append(col[0]) if fill: From 6579868c389636c2f071ebbe197d665f02e6c6e5 Mon Sep 17 00:00:00 2001 From: Ricardo Portilla Date: Thu, 12 Aug 2021 20:33:13 -0400 Subject: [PATCH 04/39] updated upsample --- python/tempo/resample.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/tempo/resample.py b/python/tempo/resample.py index bc11dde9..76b15dac 100644 --- a/python/tempo/resample.py +++ b/python/tempo/resample.py @@ -18,7 +18,7 @@ average = "mean" ceiling = "ceil" -freq_dict = {'sec' : 'seconds', 'min' : 'minutes', 'hr' : 'hours', 'day' : 'days'} +freq_dict = {'sec' : 'seconds', 'min' : 'minutes', 'hr' : 'hours', 'day' : 'days', 'hour' : 'hours'} allowableFreqs = [SEC, MIN, HR, DAY] allowableFuncs = [floor, min, max, average, ceiling] @@ -150,7 +150,7 @@ def checkAllowableFreq(tsdf, freq): return (periods, SEC) elif units.startswith(MIN): return (periods, MIN) - elif units.startswith("hour"): + elif (units.startswith("hour") | units.startswith(HR)): return (periods, "hour") elif units.startswith(DAY): return (periods, DAY) From a1b2f210acab6aedb377fe3062fd0628055f5c55 Mon Sep 17 00:00:00 2001 From: Ricardo Portilla Date: Fri, 13 Aug 2021 15:43:42 -0400 Subject: [PATCH 05/39] committing read_yaml --- python/requirements.txt | 1 + python/tempo/io.py | 5 +---- python/tests/tests.py | 46 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+), 4 deletions(-) diff --git a/python/requirements.txt b/python/requirements.txt index 52cb485c..dd2ddf00 100644 --- a/python/requirements.txt +++ b/python/requirements.txt @@ -7,3 +7,4 @@ python-dateutil==2.8.1 pytz==2020.1 six==1.15.0 wheel==0.34.2 +pyyaml \ No newline at end of file diff --git a/python/tempo/io.py b/python/tempo/io.py index e38914c0..4d4933a5 100644 --- a/python/tempo/io.py +++ b/python/tempo/io.py @@ -35,7 +35,4 @@ def write(tsdf, spark, tabName, optimizationCols = None): except Exception as e: print("Delta optimizations attempted, but was not successful.\nError: {}".format(e)) else: - print("Delta optimizations attempted on a non-Databricks platform. Switch to use Databricks Runtime to get optimization advantages.") - - - + print("Delta optimizations attempted on a non-Databricks platform. Switch to use Databricks Runtime to get optimization advantages.") \ No newline at end of file diff --git a/python/tests/tests.py b/python/tests/tests.py index 5e477de8..c458bae5 100644 --- a/python/tests/tests.py +++ b/python/tests/tests.py @@ -5,6 +5,7 @@ from pyspark.sql.types import * from tempo.tsdf import TSDF +from tempo.ad import * class SparkTest(unittest.TestCase): ## @@ -150,6 +151,51 @@ def test_describe(self): assert res.filter(F.col("min_ts") != " ").select(F.col('min_ts').cast("string")).collect()[0][0] == '2020-08-01 00:00:10' assert res.filter(F.col("max_ts") != " ").select(F.col('max_ts').cast("string")).collect()[0][0] == '2020-09-01 00:19:12' + def test_yaml_read(self): + """AS-OF Join with out a time-partition test""" + leftSchema = StructType([StructField("symbol", StringType()), + StructField("event_ts", StringType()), + StructField("trade_pr", FloatType())]) + + rightSchema = StructType([StructField("symbol", StringType()), + StructField("event_ts", StringType()), + StructField("bid_pr", FloatType()), + StructField("ask_pr", FloatType())]) + + expectedSchema = StructType([StructField("symbol", StringType()), + StructField("left_event_ts", StringType()), + StructField("left_trade_pr", FloatType()), + StructField("right_event_ts", StringType()), + StructField("right_bid_pr", FloatType()), + StructField("right_ask_pr", FloatType())]) + + left_data = [["S1", "2020-08-01 00:00:10", 349.21], + ["S1", "2020-08-01 00:01:12", 351.32], + ["S1", "2020-09-01 00:02:10", 361.1], + ["S1", "2020-09-01 00:19:12", 362.1]] + + right_data = [["S1", "2020-08-01 00:00:01", 345.11, 351.12], + ["S1", "2020-08-01 00:01:05", 348.10, 353.13], + ["S1", "2020-09-01 00:02:01", 358.93, 365.12], + ["S1", "2020-09-01 00:15:01", 359.21, 365.31]] + + expected_data = [ + ["S1", "2020-08-01 00:00:10", 349.21, "2020-08-01 00:00:01", 345.11, 351.12], + ["S1", "2020-08-01 00:01:12", 351.32, "2020-08-01 00:01:05", 348.10, 353.13], + ["S1", "2020-09-01 00:02:10", 361.1, "2020-09-01 00:02:01", 358.93, 365.12], + ["S1", "2020-09-01 00:19:12", 362.1, "2020-09-01 00:15:01", 359.21, 365.31]] + + # Construct dataframes + dfLeft = self.buildTestDF(leftSchema, left_data) + dfRight = self.buildTestDF(rightSchema, right_data) + dfExpected = self.buildTestDF(expectedSchema, expected_data, ["left_event_ts", "right_event_ts"]) + + # perform the join + self.spark.sql("create database if not exists tempo") + self.spark.range(10).withColumn("event_ts", F.current_timestamp()).withColumn("winner", F.lit('DFP')).write.mode('overwrite').saveAsTable('tempo.hourly_metrics') + file = "./ad.yaml" + res = read_yaml(self.spark, file) + class AsOfJoinTest(SparkTest): From 0c13bb8f906b9f9bfdb3b04a5624e570708abaa4 Mon Sep 17 00:00:00 2001 From: Ricardo Portilla Date: Sun, 15 Aug 2021 21:01:10 -0400 Subject: [PATCH 06/39] adding class1 with stacking --- python/tests/tests.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/python/tests/tests.py b/python/tests/tests.py index c458bae5..f8493164 100644 --- a/python/tests/tests.py +++ b/python/tests/tests.py @@ -191,10 +191,10 @@ def test_yaml_read(self): dfExpected = self.buildTestDF(expectedSchema, expected_data, ["left_event_ts", "right_event_ts"]) # perform the join - self.spark.sql("create database if not exists tempo") - self.spark.range(10).withColumn("event_ts", F.current_timestamp()).withColumn("winner", F.lit('DFP')).write.mode('overwrite').saveAsTable('tempo.hourly_metrics') + self.spark.range(10).withColumn("event_ts", F.current_timestamp()).withColumn("winner", F.lit('DFP')).withColumn("advertiser_impressions", F.lit(100)).withColumn("clicks", F.lit(5)).write.option("overwriteSchema", "true").mode('overwrite').format("delta").saveAsTable("hourly_metrics") + self.spark.range(10).withColumn("event_ts", F.current_timestamp()).withColumn("winner", F.lit('DFP')).withColumn("advertiser_impressions", F.lit(100)).withColumn("clicks", F.lit(5)).write.option("overwriteSchema", "true").mode('overwrite').format("delta").saveAsTable("monthly_metrics") file = "./ad.yaml" - res = read_yaml(self.spark, file) + res = calc_anomalies(self.spark, file) class AsOfJoinTest(SparkTest): From f043b87434ed2f5c3d59638e15b37a188b467479 Mon Sep 17 00:00:00 2001 From: Ricardo Portilla Date: Sun, 15 Aug 2021 21:05:18 -0400 Subject: [PATCH 07/39] adding class1 with stacking --- python/dbl_tempo.egg-info/PKG-INFO | 191 ++++++++++++++++++ python/dbl_tempo.egg-info/SOURCES.txt | 10 + .../dbl_tempo.egg-info/dependency_links.txt | 1 + python/dbl_tempo.egg-info/requires.txt | 3 + python/dbl_tempo.egg-info/top_level.txt | 1 + python/tempo/ad.py | 96 +++++++++ python/tests/ad.yaml | 18 ++ scala/project/build.properties | 1 + .../sbt-1.0/update/update_cache_2.12/inputs | 1 + .../sbt-1.0/update/update_cache_2.12/output | 1 + .../_global/_global/_global/streams/out | 0 .../_global/csrLogger/_global/streams/out | 15 ++ .../csrConfiguration/_global/streams/out | 0 .../_global/csrProject/_global/streams/out | 0 .../streams/update_cache_2.12/input_dsp | 1 + .../streams/update_cache_2.12/output_dsp | 1 + .../ivyConfiguration/_global/streams/out | 0 .../_global/ivySbt/_global/streams/out | 0 .../moduleSettings/_global/streams/out | 0 .../projectDescriptors/_global/streams/out | 0 .../_global/streams/out | 0 .../_global/update/_global/streams/out | 3 + .../_global/_global/compileOutputs/previous | 1 + .../_global/discoveredMainClasses/data | 1 + .../compile/bspReporter/_global/streams/out | 0 .../compile/compile/_global/streams/out | 0 .../compileIncremental/_global/streams/export | 0 .../compileIncremental/_global/streams/out | 6 + .../_global/streams/copy-resources | 1 + .../compile/copyResources/_global/streams/out | 2 + .../_global/streams/export | 1 + .../exportedProducts/_global/streams/export | 1 + .../_global/streams/export | 1 + .../compile/incOptions/_global/streams/out | 2 + .../_global/streams/export | 1 + .../_global/streams/out | 0 .../managedClasspath/_global/streams/export | 1 + .../compile/scalacOptions/_global/streams/out | 0 .../unmanagedClasspath/_global/streams/export | 1 + .../unmanagedClasspath/_global/streams/out | 0 .../unmanagedJars/_global/streams/export | 1 + .../_global/streams/export | 1 + .../exportedProducts/_global/streams/export | 1 + .../_global/streams/export | 1 + .../fullClasspath/_global/streams/export | 1 + .../_global/streams/export | 1 + .../_global/streams/out | 0 .../managedClasspath/_global/streams/export | 1 + .../unmanagedClasspath/_global/streams/export | 1 + .../unmanagedClasspath/_global/streams/out | 0 .../unmanagedJars/_global/streams/export | 1 + .../scala-2.12/scala_2.12-0.1.0-SNAPSHOT.jar | Bin 0 -> 275 bytes .../update/update_cache_2.12/inputs | 1 + .../update/update_cache_2.12/output | 1 + .../_global/_global/_global/streams/out | 0 .../_global/csrLogger/_global/streams/out | 0 .../csrConfiguration/_global/streams/out | 0 .../_global/csrProject/_global/streams/out | 0 .../streams/update_cache_2.12/input_dsp | 1 + .../streams/update_cache_2.12/output_dsp | 1 + .../ivyConfiguration/_global/streams/out | 0 .../_global/ivySbt/_global/streams/out | 0 .../moduleSettings/_global/streams/out | 0 .../projectDescriptors/_global/streams/out | 0 .../_global/streams/out | 0 .../_global/testListeners/_global/streams/out | 0 .../_global/update/_global/streams/out | 3 + .../_global/_global/compileOutputs/previous | 1 + .../_global/discoveredMainClasses/data | 1 + .../compile/bspReporter/_global/streams/out | 0 .../compile/compile/_global/streams/out | 0 .../compileIncremental/_global/streams/export | 0 .../compileIncremental/_global/streams/out | 6 + .../_global/streams/copy-resources | 1 + .../compile/copyResources/_global/streams/out | 2 + .../_global/streams/export | 1 + .../exportedProducts/_global/streams/export | 1 + .../_global/streams/export | 1 + .../compile/incOptions/_global/streams/out | 2 + .../_global/streams/export | 1 + .../_global/streams/out | 0 .../compile/mainClass/_global/streams/out | 0 .../managedClasspath/_global/streams/export | 1 + .../compile/packageBin/_global/streams/inputs | 1 + .../compile/packageBin/_global/streams/out | 4 + .../compile/packageBin/_global/streams/output | 1 + .../compile/scalacOptions/_global/streams/out | 0 .../unmanagedClasspath/_global/streams/export | 1 + .../unmanagedClasspath/_global/streams/out | 0 .../unmanagedJars/_global/streams/export | 1 + .../exportedProducts/_global/streams/export | 1 + .../unmanagedJars/_global/streams/export | 1 + .../_global/_global/compileOutputs/previous | 1 + .../_global/_global/definedTestNames/data | 1 + .../_global/dependencyClasspathFiles/previous | 1 + .../_global/discoveredMainClasses/data | 1 + .../test/bspReporter/_global/streams/out | 0 .../streams/test/compile/_global/streams/out | 0 .../compileIncremental/_global/streams/export | 0 .../compileIncremental/_global/streams/out | 6 + .../_global/streams/copy-resources | 1 + .../test/copyResources/_global/streams/out | 2 + .../test/definedTests/_global/streams/out | 2 + .../_global/streams/export | 1 + .../exportedProducts/_global/streams/export | 1 + .../_global/streams/export | 1 + .../test/fullClasspath/_global/streams/export | 1 + .../test/incOptions/_global/streams/out | 2 + .../_global/streams/export | 1 + .../_global/streams/out | 0 .../loadedTestFrameworks/_global/streams/out | 7 + .../managedClasspath/_global/streams/export | 1 + .../test/scalacOptions/_global/streams/out | 0 .../streams/test/test/_global/streams/out | 0 .../unmanagedClasspath/_global/streams/export | 1 + .../unmanagedClasspath/_global/streams/out | 0 .../test/unmanagedJars/_global/streams/export | 1 + 117 files changed, 438 insertions(+) create mode 100644 python/dbl_tempo.egg-info/PKG-INFO create mode 100644 python/dbl_tempo.egg-info/SOURCES.txt create mode 100644 python/dbl_tempo.egg-info/dependency_links.txt create mode 100644 python/dbl_tempo.egg-info/requires.txt create mode 100644 python/dbl_tempo.egg-info/top_level.txt create mode 100644 python/tempo/ad.py create mode 100644 python/tests/ad.yaml create mode 100644 scala/project/build.properties create mode 100644 scala/project/target/scala-2.12/sbt-1.0/update/update_cache_2.12/inputs create mode 100644 scala/project/target/scala-2.12/sbt-1.0/update/update_cache_2.12/output create mode 100644 scala/project/target/streams/_global/_global/_global/streams/out create mode 100644 scala/project/target/streams/_global/_global/csrLogger/_global/streams/out create mode 100644 scala/project/target/streams/_global/csrConfiguration/_global/streams/out create mode 100644 scala/project/target/streams/_global/csrProject/_global/streams/out create mode 100644 scala/project/target/streams/_global/dependencyPositions/_global/streams/update_cache_2.12/input_dsp create mode 100644 scala/project/target/streams/_global/dependencyPositions/_global/streams/update_cache_2.12/output_dsp create mode 100644 scala/project/target/streams/_global/ivyConfiguration/_global/streams/out create mode 100644 scala/project/target/streams/_global/ivySbt/_global/streams/out create mode 100644 scala/project/target/streams/_global/moduleSettings/_global/streams/out create mode 100644 scala/project/target/streams/_global/projectDescriptors/_global/streams/out create mode 100644 scala/project/target/streams/_global/scalaCompilerBridgeScope/_global/streams/out create mode 100644 scala/project/target/streams/_global/update/_global/streams/out create mode 100644 scala/project/target/streams/compile/_global/_global/compileOutputs/previous create mode 100644 scala/project/target/streams/compile/_global/_global/discoveredMainClasses/data create mode 100644 scala/project/target/streams/compile/bspReporter/_global/streams/out create mode 100644 scala/project/target/streams/compile/compile/_global/streams/out create mode 100644 scala/project/target/streams/compile/compileIncremental/_global/streams/export create mode 100644 scala/project/target/streams/compile/compileIncremental/_global/streams/out create mode 100644 scala/project/target/streams/compile/copyResources/_global/streams/copy-resources create mode 100644 scala/project/target/streams/compile/copyResources/_global/streams/out create mode 100644 scala/project/target/streams/compile/dependencyClasspath/_global/streams/export create mode 100644 scala/project/target/streams/compile/exportedProducts/_global/streams/export create mode 100644 scala/project/target/streams/compile/externalDependencyClasspath/_global/streams/export create mode 100644 scala/project/target/streams/compile/incOptions/_global/streams/out create mode 100644 scala/project/target/streams/compile/internalDependencyClasspath/_global/streams/export create mode 100644 scala/project/target/streams/compile/internalDependencyClasspath/_global/streams/out create mode 100644 scala/project/target/streams/compile/managedClasspath/_global/streams/export create mode 100644 scala/project/target/streams/compile/scalacOptions/_global/streams/out create mode 100644 scala/project/target/streams/compile/unmanagedClasspath/_global/streams/export create mode 100644 scala/project/target/streams/compile/unmanagedClasspath/_global/streams/out create mode 100644 scala/project/target/streams/compile/unmanagedJars/_global/streams/export create mode 100644 scala/project/target/streams/runtime/dependencyClasspath/_global/streams/export create mode 100644 scala/project/target/streams/runtime/exportedProducts/_global/streams/export create mode 100644 scala/project/target/streams/runtime/externalDependencyClasspath/_global/streams/export create mode 100644 scala/project/target/streams/runtime/fullClasspath/_global/streams/export create mode 100644 scala/project/target/streams/runtime/internalDependencyClasspath/_global/streams/export create mode 100644 scala/project/target/streams/runtime/internalDependencyClasspath/_global/streams/out create mode 100644 scala/project/target/streams/runtime/managedClasspath/_global/streams/export create mode 100644 scala/project/target/streams/runtime/unmanagedClasspath/_global/streams/export create mode 100644 scala/project/target/streams/runtime/unmanagedClasspath/_global/streams/out create mode 100644 scala/project/target/streams/runtime/unmanagedJars/_global/streams/export create mode 100644 scala/target/scala-2.12/scala_2.12-0.1.0-SNAPSHOT.jar create mode 100644 scala/target/scala-2.12/update/update_cache_2.12/inputs create mode 100644 scala/target/scala-2.12/update/update_cache_2.12/output create mode 100644 scala/target/streams/_global/_global/_global/streams/out create mode 100644 scala/target/streams/_global/_global/csrLogger/_global/streams/out create mode 100644 scala/target/streams/_global/csrConfiguration/_global/streams/out create mode 100644 scala/target/streams/_global/csrProject/_global/streams/out create mode 100644 scala/target/streams/_global/dependencyPositions/_global/streams/update_cache_2.12/input_dsp create mode 100644 scala/target/streams/_global/dependencyPositions/_global/streams/update_cache_2.12/output_dsp create mode 100644 scala/target/streams/_global/ivyConfiguration/_global/streams/out create mode 100644 scala/target/streams/_global/ivySbt/_global/streams/out create mode 100644 scala/target/streams/_global/moduleSettings/_global/streams/out create mode 100644 scala/target/streams/_global/projectDescriptors/_global/streams/out create mode 100644 scala/target/streams/_global/scalaCompilerBridgeScope/_global/streams/out create mode 100644 scala/target/streams/_global/testListeners/_global/streams/out create mode 100644 scala/target/streams/_global/update/_global/streams/out create mode 100644 scala/target/streams/compile/_global/_global/compileOutputs/previous create mode 100644 scala/target/streams/compile/_global/_global/discoveredMainClasses/data create mode 100644 scala/target/streams/compile/bspReporter/_global/streams/out create mode 100644 scala/target/streams/compile/compile/_global/streams/out create mode 100644 scala/target/streams/compile/compileIncremental/_global/streams/export create mode 100644 scala/target/streams/compile/compileIncremental/_global/streams/out create mode 100644 scala/target/streams/compile/copyResources/_global/streams/copy-resources create mode 100644 scala/target/streams/compile/copyResources/_global/streams/out create mode 100644 scala/target/streams/compile/dependencyClasspath/_global/streams/export create mode 100644 scala/target/streams/compile/exportedProducts/_global/streams/export create mode 100644 scala/target/streams/compile/externalDependencyClasspath/_global/streams/export create mode 100644 scala/target/streams/compile/incOptions/_global/streams/out create mode 100644 scala/target/streams/compile/internalDependencyClasspath/_global/streams/export create mode 100644 scala/target/streams/compile/internalDependencyClasspath/_global/streams/out create mode 100644 scala/target/streams/compile/mainClass/_global/streams/out create mode 100644 scala/target/streams/compile/managedClasspath/_global/streams/export create mode 100644 scala/target/streams/compile/packageBin/_global/streams/inputs create mode 100644 scala/target/streams/compile/packageBin/_global/streams/out create mode 100644 scala/target/streams/compile/packageBin/_global/streams/output create mode 100644 scala/target/streams/compile/scalacOptions/_global/streams/out create mode 100644 scala/target/streams/compile/unmanagedClasspath/_global/streams/export create mode 100644 scala/target/streams/compile/unmanagedClasspath/_global/streams/out create mode 100644 scala/target/streams/compile/unmanagedJars/_global/streams/export create mode 100644 scala/target/streams/runtime/exportedProducts/_global/streams/export create mode 100644 scala/target/streams/runtime/unmanagedJars/_global/streams/export create mode 100644 scala/target/streams/test/_global/_global/compileOutputs/previous create mode 100644 scala/target/streams/test/_global/_global/definedTestNames/data create mode 100644 scala/target/streams/test/_global/_global/dependencyClasspathFiles/previous create mode 100644 scala/target/streams/test/_global/_global/discoveredMainClasses/data create mode 100644 scala/target/streams/test/bspReporter/_global/streams/out create mode 100644 scala/target/streams/test/compile/_global/streams/out create mode 100644 scala/target/streams/test/compileIncremental/_global/streams/export create mode 100644 scala/target/streams/test/compileIncremental/_global/streams/out create mode 100644 scala/target/streams/test/copyResources/_global/streams/copy-resources create mode 100644 scala/target/streams/test/copyResources/_global/streams/out create mode 100644 scala/target/streams/test/definedTests/_global/streams/out create mode 100644 scala/target/streams/test/dependencyClasspath/_global/streams/export create mode 100644 scala/target/streams/test/exportedProducts/_global/streams/export create mode 100644 scala/target/streams/test/externalDependencyClasspath/_global/streams/export create mode 100644 scala/target/streams/test/fullClasspath/_global/streams/export create mode 100644 scala/target/streams/test/incOptions/_global/streams/out create mode 100644 scala/target/streams/test/internalDependencyClasspath/_global/streams/export create mode 100644 scala/target/streams/test/internalDependencyClasspath/_global/streams/out create mode 100644 scala/target/streams/test/loadedTestFrameworks/_global/streams/out create mode 100644 scala/target/streams/test/managedClasspath/_global/streams/export create mode 100644 scala/target/streams/test/scalacOptions/_global/streams/out create mode 100644 scala/target/streams/test/test/_global/streams/out create mode 100644 scala/target/streams/test/unmanagedClasspath/_global/streams/export create mode 100644 scala/target/streams/test/unmanagedClasspath/_global/streams/out create mode 100644 scala/target/streams/test/unmanagedJars/_global/streams/export diff --git a/python/dbl_tempo.egg-info/PKG-INFO b/python/dbl_tempo.egg-info/PKG-INFO new file mode 100644 index 00000000..a17f6394 --- /dev/null +++ b/python/dbl_tempo.egg-info/PKG-INFO @@ -0,0 +1,191 @@ +Metadata-Version: 2.1 +Name: dbl-tempo +Version: 0.1.0 +Summary: Spark Time Series Utility Package +Home-page: https://github.com/databrickslabs/tempo +Author: Ricardo Portilla, Databricks +Author-email: ricardo.portilla@databricks.com +License: UNKNOWN +Description: # tempo - Time Series Utilities for Data Teams Using Databricks + +

+ +

+ + + ## Project Description + The purpose of this project is to make time series manipulation with Spark simpler. Operations covered under this package include AS OF joins, rolling statistics with user-specified window lengths, featurization of time series using lagged values, and Delta Lake optimization on time and partition fields. + + [![codecov](https://codecov.io/gh/databrickslabs/tempo/branch/master/graph/badge.svg)](https://codecov.io/gh/databrickslabs/tempo) + + ## Using the Project + + Python install in Databricks notebooks using: + + ``` + %pip install -e git+https://github.com/databrickslabs/tempo.git#"egg=tempo&#subdirectory=python" + ``` + + Install locally using: + + ``` + pip install -e git+https://github.com/databrickslabs/tempo.git#"egg=tempo&#subdirectory=python" + ``` + + Scala installation: + + Once the jar is created (via the following instructions), upload the jar to Databricks for use in a notebook or job: + + ``` + cd scala/tempo + sbt package + ``` + + + + ### Starting Point: TSDF object, a wrapper over a Spark data frame + The entry point into all features for time series analysis in tempo is a TSDF object which wraps the Spark data frame. At a high level, a TSDF contains a data frame which contains many smaller time series, one per partition key. In order to create a TSDF object, a distinguished timestamp column much be provided in order for sorting purposes for public methods. Optionally, a sequence number and partition columns can be provided as the assumptive columns on which to create new features from. Below are the public methods available for TSDF transformation and enrichment. + + #### Sample Reference Architecture for Capital Markets + +

+ +

+ + ## Quickstart - Python + + Data source is UCI public accelerometer data available at this URL https://archive.ics.uci.edu/ml/datasets/Heterogeneity+Activity+Recognition + + #### 0. Read in Data + + ``` + from pyspark.sql.functions import * + + phone_accel_df = spark.read.format("csv").option("header", "true").load("dbfs:/home/tempo/Phones_accelerometer").withColumn("event_ts", (col("Arrival_Time").cast("double")/1000).cast("timestamp")).withColumn("x", col("x").cast("double")).withColumn("y", col("y").cast("double")).withColumn("z", col("z").cast("double")).withColumn("event_ts_dbl", col("event_ts").cast("double")) + + from tempo import * + + phone_accel_tsdf = TSDF(phone_accel_df, ts_col="event_ts", partition_cols = ["User"]) + ``` + + #### 1. Resample and Visualize + + ###### Sample usage: + Possible values for frequency include patterns such as 1 minute, 4 hours, 2 days or simply sec, min, day. For the accepted functions to aggreagate data, options are floor, ceil, min, max, mean. Custom functions will be available in a future release. + + ``` + # ts_col = timestamp column on which to sort fact and source table + # partition_cols - columns to use for partitioning the TSDF into more granular time series for windowing and sorting + + resampled_sdf = phone_accel_tsdf.resample(freq='min', func='floor') + resampled_pdf = resampled_sdf.df.filter(col('event_ts').cast("date") == "2015-02-23").toPandas() + + import plotly.graph_objs as go + import plotly.express as px + import pandas as pd + + # Plotly figure 1 + fig = px.line(resampled_pdf, x='event_ts', y='z', + color="User", + line_group="User", hover_name="User") + fig.update_layout(title='Phone Accelerometer Usage' , showlegend=False) + + fig.show() + ``` + + #### 2. AS OF Join + ##### This join uses windowing in order to select the latest record from a source table and merges this onto the base Fact table + + +

+ +

+ + + ``` + from pyspark.sql.functions import * + + watch_accel_df = spark.read.format("csv").option("header", "true").load("dbfs:/home/tempo/Watch_accelerometer").withColumn("event_ts", (col("Arrival_Time").cast("double")/1000).cast("timestamp")).withColumn("x", col("x").cast("double")).withColumn("y", col("y").cast("double")).withColumn("z", col("z").cast("double")).withColumn("event_ts_dbl", col("event_ts").cast("double")) + + watch_accel_tsdf = TSDF(watch_accel_df, ts_col="event_ts", partition_cols = ["User"]) + + # Applying AS OF join to TSDF datasets + joined_df = watch_accel_tsdf.asofJoin(phone_accel_tsdf, right_prefix="phone_accel").df + + joined_df.show(10, False) + ``` + + #### 3. Skew Join Optimized AS OF Join + + The purpose of the skew optimized as of join is to bucket each set of `partition_cols` to get the latest source record merged onto the fact table + + Parameters: + + ts_col = timestamp column for sorting + partition_cols = partition columns for defining granular time series for windowing and sorting + tsPartitionVal = value to break up each partition into time brackets + fraction = overlap fraction + right_prefix = prefix used for source columns when merged into fact table + + ``` + joined_df = watch_accel_tsdf.asofJoin(phone_accel_tsdf, right_prefix="watch_accel", tsPartitionVal = 10, fraction = 0.1).df + joined_df.show(10, False) + ``` + + #### 4 - Approximate Exponential Moving Average + + The approximate exponential moving average uses an approximation of the form `EMA = e * lag(col,0) + e * (1 - e) * lag(col, 1) + e * (1 - e)^2 * lag(col, 2) ` to define a rolling moving average based on exponential decay. + + Parameters: + + window = number of lagged values to compute for moving average + + ``` + ema_trades = watch_accel_tsdf.EMA("x", window = 50).df + ema_trades.show(10, False) + ``` + + #### 5 - Simple Moving Average + + Method for computing rolling statistics based on the distinguished timestamp column + + Parameters: + + rangeBackWindowSecs = number of seconds to look back + + ``` + moving_avg = watch_accel_tsdf.withRangeStats("y", rangeBackWindowSecs=600).df + moving_avg.select('event_ts', 'x', 'y', 'z', 'mean_y').show(10, False) + `` + + + + ## Project Support + Please note that all projects in the /databrickslabs github account are provided for your exploration only, and are not formally supported by Databricks with Service Level Agreements (SLAs). They are provided AS-IS and we do not make any guarantees of any kind. Please do not submit a support ticket relating to any issues arising from the use of these projects. + + Any issues discovered through the use of this project should be filed as GitHub Issues on the Repo. They will be reviewed as time permits, but there are no formal SLAs for support. + + ## Project Setup + After cloning the repo, it is highly advised that you create a [virtual environment](https://docs.python.org/3/library/venv.html) to isolate and manage + packages for this project, like so: + + `python -m venv /venv` + + You can then install the required modules via pip: + + `pip install requirements.txt` + + ## Building the Project + Once in the main project folder, build into a wheel using the following command: + + `python setup.py bdist_wheel` + + ## Releasing the Project + Instructions for how to release a version of the project + +Platform: UNKNOWN +Classifier: Programming Language :: Python :: 3 +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Description-Content-Type: text/markdown +Provides-Extra: tests diff --git a/python/dbl_tempo.egg-info/SOURCES.txt b/python/dbl_tempo.egg-info/SOURCES.txt new file mode 100644 index 00000000..e3b973ba --- /dev/null +++ b/python/dbl_tempo.egg-info/SOURCES.txt @@ -0,0 +1,10 @@ +setup.py +dbl_tempo.egg-info/PKG-INFO +dbl_tempo.egg-info/SOURCES.txt +dbl_tempo.egg-info/dependency_links.txt +dbl_tempo.egg-info/requires.txt +dbl_tempo.egg-info/top_level.txt +tempo/__init__.py +tempo/io.py +tempo/resample.py +tempo/tsdf.py \ No newline at end of file diff --git a/python/dbl_tempo.egg-info/dependency_links.txt b/python/dbl_tempo.egg-info/dependency_links.txt new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/python/dbl_tempo.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/python/dbl_tempo.egg-info/requires.txt b/python/dbl_tempo.egg-info/requires.txt new file mode 100644 index 00000000..6f7494bd --- /dev/null +++ b/python/dbl_tempo.egg-info/requires.txt @@ -0,0 +1,3 @@ + +[tests] +pytest diff --git a/python/dbl_tempo.egg-info/top_level.txt b/python/dbl_tempo.egg-info/top_level.txt new file mode 100644 index 00000000..e764a30b --- /dev/null +++ b/python/dbl_tempo.egg-info/top_level.txt @@ -0,0 +1 @@ +tempo diff --git a/python/tempo/ad.py b/python/tempo/ad.py new file mode 100644 index 00000000..e60690d2 --- /dev/null +++ b/python/tempo/ad.py @@ -0,0 +1,96 @@ +from tempo.tsdf import TSDF +import pyspark.sql.functions as F + +def calc_anomalies(spark, yaml_file): + + import os + import yaml + + yaml_path = '' + + if (yaml_file.startswith("s3")): + import boto3 + + s3 = boto3.client('s3') + s3_bucket = yaml_file.split("s3://")[1] + bucket_file_tuple = s3_bucket.split("/") + bucket_name_only = bucket_file_tuple[0] + file_only = "/".join(bucket_file_tuple[1:]) + + s3.download_file(bucket_name_only, file_only, 'ad.yaml') + yaml_path = '/databricks/driver/ad.yaml' + elif yaml_file.startswith("dbfs:/") & (os.getenv('DATABRICKS_RUNTIME_VERSION') != None): + new_dbfs_path = "/" + yaml_file.replace(":", "") + yaml_path = new_dbfs_path + else: + yaml_path = yaml_file + + print(yaml_path) + + with open(yaml_path) as f: + + data = yaml.load(f, Loader=yaml.FullLoader) + print(data) + print('data type is ' + str(type(data))) + + import json + for d in data.keys(): + print(d) + print(data[d]) + table = data[d]['database'] + '.' + data[d]['name'] + df = spark.table(table) + partition_cols = data[d]['partition_cols'] + ts_col = data[d]['ts_col'] + mode = data[d]['mode'] + metrics = data[d]['metrics'] + lkbck_window = data[d]['lookback_window'] + #tsdf = TSDF(df, partition_cols = partition_cols, ts_col = ts_col) + + # logic to stack metrics instead of individual columns + l = [] + sep = ', ' + sql_list = sep.join(metrics).split(",") + n = len(metrics) + for a in range(n): + l.append("'{}'".format(metrics[a]) + "," + sql_list[a]) + # partition_col string + partition_cols_str = ", ".join(partition_cols) + metrics_cols_str = ", ".join(metrics) + k = sep.join(l) + for metric_col in metrics: + df = df.withColumn(metric_col, F.col(metric_col).cast("double")) + + df.createOrReplaceTempView("tsdf_view") + stacked = spark.sql("select {}, {}, {}, stack({}, {}) as (metric, value) from tsdf_view".format(ts_col, partition_cols_str, metrics_cols_str, n, k)) + + part_cols_w_metrics = partition_cols + metrics + + tsdf = TSDF(stacked, partition_cols = part_cols_w_metrics, ts_col = ts_col) + moving_avg = tsdf.withRangeStats(['value'], rangeBackWindowSecs=int(lkbck_window)).df + anomalies = moving_avg.select(ts_col, *partition_cols, 'zscore_' + 'value').withColumn("anomaly_fl", F.when(F.col('zscore_' + 'value') > 2.5, 1).otherwise(0)) + + # class 1 - 2.5 standard deviations outside mean + # brand new table + if mode == 'new': + anomalies.write.mode('overwrite').format("delta").saveAsTable(table + "_class1") + # append to existing table without DLT + elif mode == 'append': + # incremental append with DLT + print('hey') + elif (mode == 'incremental') & (os.getenv('DATABRICKS_RUNTIME_VERSION') != None): + import dlt + @dlt.view + def taxi_raw(): + return spark.read.json("/databricks-datasets/nyctaxi/sample/json/") + + # Use the function name as the table name + @dlt.table + def filtered_data(): + return dlt.read("taxi_raw").where(...) + + # Use the name parameter as the table name + @dlt.table(name="filtered_data") + def create_filtered_data(): + return dlt.read("taxi_raw").where(...) + #anomalies.write.format("delta").saveAsTable("class1") + diff --git a/python/tests/ad.yaml b/python/tests/ad.yaml new file mode 100644 index 00000000..e91647a4 --- /dev/null +++ b/python/tests/ad.yaml @@ -0,0 +1,18 @@ +table1: + database : "default" + name : "hourly_metrics" + ts_col : "event_ts" + lookback_window : "84600" + mode : "new" + # include any grouping columns or metrics you wish to detect anomalies on + partition_cols : ["winner"] + metrics : ["advertiser_impressions"] +table2: + database : "default" + name : "monthly_metrics" + mode : "new" + ts_col : "event_ts" + lookback_window : "84600" + # include any grouping columns or metrics you wish to detect anomalies on + partition_cols : ["winner"] + metrics : ["advertiser_impressions", "clicks"] \ No newline at end of file diff --git a/scala/project/build.properties b/scala/project/build.properties new file mode 100644 index 00000000..dbae93bc --- /dev/null +++ b/scala/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.4.9 diff --git a/scala/project/target/scala-2.12/sbt-1.0/update/update_cache_2.12/inputs b/scala/project/target/scala-2.12/sbt-1.0/update/update_cache_2.12/inputs new file mode 100644 index 00000000..3135d87c --- /dev/null +++ b/scala/project/target/scala-2.12/sbt-1.0/update/update_cache_2.12/inputs @@ -0,0 +1 @@ +1318958014 \ No newline at end of file diff --git a/scala/project/target/scala-2.12/sbt-1.0/update/update_cache_2.12/output b/scala/project/target/scala-2.12/sbt-1.0/update/update_cache_2.12/output new file mode 100644 index 00000000..c5884377 --- /dev/null +++ b/scala/project/target/scala-2.12/sbt-1.0/update/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":".","configurations":[{"configuration":{"name":"compile"},"modules":[],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.12","configurations":"default","isChanging":false,"isTransitive":true,"isForce":false,"explicitArtifacts":[],"inclusions":[],"exclusions":[{"organization":"org.scala-sbt","name":"io_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"librarymanagement-ivy_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"util-position_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"sbt","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"util-logging_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"scripted-plugin_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"librarymanagement-core_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}}],"extraAttributes":{"info.apiURL":"https://www.scala-lang.org/api/2.12.12/"},"crossVersion":{"type":"Disabled"}},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","configurations":[],"extraAttributes":{},"allowInsecureProtocol":false},"file:///Users/ricardo.portilla/.sbt/boot/scala-2.12.12/lib/scala-library.jar"]],"missingArtifacts":[],"evicted":false,"homepage":"https://www.scala-lang.org/","extraAttributes":{"info.apiURL":"https://www.scala-lang.org/api/2.12.12/"},"configurations":[{"name":"test"},{"name":"optional"},{"name":"compile"},{"name":"default"},{"name":"runtime"}],"licenses":[["Apache-2.0","https://www.apache.org/licenses/LICENSE-2.0"]],"callers":[]}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"provided"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.12","configurations":"default","isChanging":false,"isTransitive":true,"isForce":false,"explicitArtifacts":[],"inclusions":[],"exclusions":[{"organization":"org.scala-sbt","name":"io_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"librarymanagement-ivy_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"util-position_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"sbt","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"util-logging_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"scripted-plugin_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"librarymanagement-core_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}}],"extraAttributes":{"info.apiURL":"https://www.scala-lang.org/api/2.12.12/"},"crossVersion":{"type":"Disabled"}},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","configurations":[],"extraAttributes":{},"allowInsecureProtocol":false},"file:///Users/ricardo.portilla/.sbt/boot/scala-2.12.12/lib/scala-library.jar"]],"missingArtifacts":[],"evicted":false,"homepage":"https://www.scala-lang.org/","extraAttributes":{"info.apiURL":"https://www.scala-lang.org/api/2.12.12/"},"configurations":[{"name":"test"},{"name":"optional"},{"name":"compile"},{"name":"default"},{"name":"runtime"}],"licenses":[["Apache-2.0","https://www.apache.org/licenses/LICENSE-2.0"]],"callers":[]}],"details":[]},{"configuration":{"name":"runtime"},"modules":[],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.12","configurations":"default","isChanging":false,"isTransitive":true,"isForce":false,"explicitArtifacts":[],"inclusions":[],"exclusions":[{"organization":"org.scala-sbt","name":"io_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"librarymanagement-ivy_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"util-position_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"sbt","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"util-logging_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"scripted-plugin_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"librarymanagement-core_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}}],"extraAttributes":{},"crossVersion":{"type":"Disabled"}},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar","configurations":[],"extraAttributes":{},"allowInsecureProtocol":false},"file:///Users/ricardo.portilla/.sbt/boot/scala-2.12.12/lib/scala-compiler.jar"]],"missingArtifacts":[],"evicted":false,"homepage":"https://www.scala-lang.org/","extraAttributes":{},"configurations":[{"name":"test"},{"name":"optional"},{"name":"compile"},{"name":"default"},{"name":"runtime"}],"licenses":[["Apache-2.0","https://www.apache.org/licenses/LICENSE-2.0"]],"callers":[]},{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.12","configurations":"optional","isChanging":false,"isTransitive":true,"isForce":false,"explicitArtifacts":[],"inclusions":[],"exclusions":[{"organization":"org.scala-sbt","name":"io_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"librarymanagement-ivy_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"util-position_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"sbt","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"util-logging_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"scripted-plugin_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"librarymanagement-core_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}}],"extraAttributes":{},"crossVersion":{"type":"Disabled"}},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar","configurations":[],"extraAttributes":{},"allowInsecureProtocol":false},"file:///Users/ricardo.portilla/.sbt/boot/scala-2.12.12/lib/scala-compiler.jar"]],"missingArtifacts":[],"evicted":false,"homepage":"https://www.scala-lang.org/","extraAttributes":{},"configurations":[{"name":"test"},{"name":"optional"},{"name":"compile"},{"name":"default"},{"name":"runtime"}],"licenses":[["Apache-2.0","https://www.apache.org/licenses/LICENSE-2.0"]],"callers":[]},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.12","configurations":"default","isChanging":false,"isTransitive":true,"isForce":false,"explicitArtifacts":[],"inclusions":[],"exclusions":[{"organization":"org.scala-sbt","name":"io_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"librarymanagement-ivy_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"util-position_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"sbt","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"util-logging_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"scripted-plugin_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"librarymanagement-core_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}}],"extraAttributes":{"info.apiURL":"https://www.scala-lang.org/api/2.12.12/"},"crossVersion":{"type":"Disabled"}},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","configurations":[],"extraAttributes":{},"allowInsecureProtocol":false},"file:///Users/ricardo.portilla/.sbt/boot/scala-2.12.12/lib/scala-library.jar"]],"missingArtifacts":[],"evicted":false,"homepage":"https://www.scala-lang.org/","extraAttributes":{"info.apiURL":"https://www.scala-lang.org/api/2.12.12/"},"configurations":[{"name":"test"},{"name":"optional"},{"name":"compile"},{"name":"default"},{"name":"runtime"}],"licenses":[["Apache-2.0","https://www.apache.org/licenses/LICENSE-2.0"]],"callers":[]},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.12","configurations":"optional","isChanging":false,"isTransitive":true,"isForce":false,"explicitArtifacts":[],"inclusions":[],"exclusions":[{"organization":"org.scala-sbt","name":"io_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"librarymanagement-ivy_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"util-position_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"sbt","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"util-logging_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"scripted-plugin_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"librarymanagement-core_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}}],"extraAttributes":{"info.apiURL":"https://www.scala-lang.org/api/2.12.12/"},"crossVersion":{"type":"Disabled"}},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","configurations":[],"extraAttributes":{},"allowInsecureProtocol":false},"file:///Users/ricardo.portilla/.sbt/boot/scala-2.12.12/lib/scala-library.jar"]],"missingArtifacts":[],"evicted":false,"homepage":"https://www.scala-lang.org/","extraAttributes":{"info.apiURL":"https://www.scala-lang.org/api/2.12.12/"},"configurations":[{"name":"test"},{"name":"optional"},{"name":"compile"},{"name":"default"},{"name":"runtime"}],"licenses":[["Apache-2.0","https://www.apache.org/licenses/LICENSE-2.0"]],"callers":[]},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.12","configurations":"default","isChanging":false,"isTransitive":true,"isForce":false,"explicitArtifacts":[],"inclusions":[],"exclusions":[{"organization":"org.scala-sbt","name":"io_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"librarymanagement-ivy_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"util-position_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"sbt","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"util-logging_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"scripted-plugin_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"librarymanagement-core_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}}],"extraAttributes":{"info.apiURL":"https://www.scala-lang.org/api/2.12.12/"},"crossVersion":{"type":"Disabled"}},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar","configurations":[],"extraAttributes":{},"allowInsecureProtocol":false},"file:///Users/ricardo.portilla/.sbt/boot/scala-2.12.12/lib/scala-reflect.jar"]],"missingArtifacts":[],"evicted":false,"homepage":"https://www.scala-lang.org/","extraAttributes":{"info.apiURL":"https://www.scala-lang.org/api/2.12.12/"},"configurations":[{"name":"test"},{"name":"optional"},{"name":"compile"},{"name":"default"},{"name":"runtime"}],"licenses":[["Apache-2.0","https://www.apache.org/licenses/LICENSE-2.0"]],"callers":[]},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"1.0.6","configurations":"default","isChanging":false,"isTransitive":true,"isForce":false,"explicitArtifacts":[],"inclusions":[],"exclusions":[{"organization":"org.scala-sbt","name":"io_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"librarymanagement-ivy_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"util-position_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"sbt","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"util-logging_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-lang","name":"*","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"scripted-plugin_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"librarymanagement-core_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}}],"extraAttributes":{},"crossVersion":{"type":"Disabled"}},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar","configurations":[],"url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/1.0.6/scala-xml_2.12-1.0.6.jar","extraAttributes":{},"allowInsecureProtocol":false},"file:///Users/ricardo.portilla/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/1.0.6/scala-xml_2.12-1.0.6.jar"]],"missingArtifacts":[],"evicted":false,"homepage":"http://www.scala-lang.org/","extraAttributes":{},"configurations":[{"name":"test"},{"name":"optional"},{"name":"compile"},{"name":"default"},{"name":"runtime"}],"licenses":[["BSD 3-clause","http://opensource.org/licenses/BSD-3-Clause"]],"callers":[]},{"module":{"organization":"jline","name":"jline","revision":"2.14.6","configurations":"default","isChanging":false,"isTransitive":true,"isForce":false,"explicitArtifacts":[],"inclusions":[],"exclusions":[{"organization":"org.scala-sbt","name":"io_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"librarymanagement-ivy_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"util-position_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"sbt","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"util-logging_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"scripted-plugin_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"librarymanagement-core_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}}],"extraAttributes":{},"crossVersion":{"type":"Disabled"}},"artifacts":[[{"name":"jline","type":"jar","extension":"jar","configurations":[],"url":"https://repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar","extraAttributes":{},"allowInsecureProtocol":false},"file:///Users/ricardo.portilla/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"]],"missingArtifacts":[],"evicted":false,"extraAttributes":{},"configurations":[{"name":"test"},{"name":"optional"},{"name":"compile"},{"name":"default"},{"name":"runtime"}],"licenses":[["The BSD License","http://www.opensource.org/licenses/bsd-license.php"]],"callers":[]},{"module":{"organization":"org.fusesource.jansi","name":"jansi","revision":"1.12","configurations":"default","isChanging":false,"isTransitive":true,"isForce":false,"explicitArtifacts":[],"inclusions":[],"exclusions":[{"organization":"org.scala-sbt","name":"io_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"librarymanagement-ivy_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"util-position_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"sbt","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"util-logging_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"scripted-plugin_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"librarymanagement-core_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}}],"extraAttributes":{},"crossVersion":{"type":"Disabled"}},"artifacts":[[{"name":"jansi","type":"jar","extension":"jar","configurations":[],"url":"https://repo1.maven.org/maven2/org/fusesource/jansi/jansi/1.12/jansi-1.12.jar","extraAttributes":{},"allowInsecureProtocol":false},"file:///Users/ricardo.portilla/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/org/fusesource/jansi/jansi/1.12/jansi-1.12.jar"]],"missingArtifacts":[],"evicted":false,"extraAttributes":{},"configurations":[{"name":"test"},{"name":"optional"},{"name":"compile"},{"name":"default"},{"name":"runtime"}],"licenses":[],"callers":[]}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.12","configurations":"default","isChanging":false,"isTransitive":true,"isForce":false,"explicitArtifacts":[],"inclusions":[],"exclusions":[{"organization":"org.scala-sbt","name":"io_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"librarymanagement-ivy_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"util-position_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"sbt","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"util-logging_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"scripted-plugin_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}},{"organization":"org.scala-sbt","name":"librarymanagement-core_2.12","artifact":"*","configurations":[],"crossVersion":{"type":"Disabled"}}],"extraAttributes":{"info.apiURL":"https://www.scala-lang.org/api/2.12.12/"},"crossVersion":{"type":"Disabled"}},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","configurations":[],"extraAttributes":{},"allowInsecureProtocol":false},"file:///Users/ricardo.portilla/.sbt/boot/scala-2.12.12/lib/scala-library.jar"]],"missingArtifacts":[],"evicted":false,"homepage":"https://www.scala-lang.org/","extraAttributes":{"info.apiURL":"https://www.scala-lang.org/api/2.12.12/"},"configurations":[{"name":"test"},{"name":"optional"},{"name":"compile"},{"name":"default"},{"name":"runtime"}],"licenses":[["Apache-2.0","https://www.apache.org/licenses/LICENSE-2.0"]],"callers":[]}],"details":[]}],"stats":{"resolveTime":-1,"downloadTime":-1,"downloadSize":-1,"cached":true},"stamps":{}} \ No newline at end of file diff --git a/scala/project/target/streams/_global/_global/_global/streams/out b/scala/project/target/streams/_global/_global/_global/streams/out new file mode 100644 index 00000000..e69de29b diff --git a/scala/project/target/streams/_global/_global/csrLogger/_global/streams/out b/scala/project/target/streams/_global/_global/csrLogger/_global/streams/out new file mode 100644 index 00000000..46fbb2c8 --- /dev/null +++ b/scala/project/target/streams/_global/_global/csrLogger/_global/streams/out @@ -0,0 +1,15 @@ +[debug] downloaded https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.12/scala-library-2.12.12.pom +[debug] downloaded https://repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.12.12/scala-compiler-2.12.12.pom +[debug] downloaded https://repo1.maven.org/maven2/org/scala-lang/scala-reflect/2.12.12/scala-reflect-2.12.12.pom +[debug] downloaded https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/1.0.6/scala-xml_2.12-1.0.6.pom +[debug] downloaded https://repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.pom +[debug] downloaded https://repo1.maven.org/maven2/org/fusesource/jansi/jansi/1.12/jansi-1.12.pom +[debug] downloaded https://repo1.maven.org/maven2/org/fusesource/jansi/jansi-project/1.12/jansi-project-1.12.pom +[debug] downloaded https://repo1.maven.org/maven2/org/sonatype/oss/oss-parent/9/oss-parent-9.pom +[debug] downloaded https://repo1.maven.org/maven2/org/fusesource/fusesource-pom/1.11/fusesource-pom-1.11.pom +[debug] downloaded https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/1.0.6/scala-xml_2.12-1.0.6.jar +[debug] downloaded https://repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar +[debug] downloaded https://repo1.maven.org/maven2/org/fusesource/jansi/jansi/1.12/jansi-1.12.jar +[debug] downloaded https://repo1.maven.org/maven2/org/scala-lang/scala-reflect/2.12.12/scala-reflect-2.12.12.jar +[debug] downloaded https://repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.12.12/scala-compiler-2.12.12.jar +[debug] downloaded https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.12/scala-library-2.12.12.jar diff --git a/scala/project/target/streams/_global/csrConfiguration/_global/streams/out b/scala/project/target/streams/_global/csrConfiguration/_global/streams/out new file mode 100644 index 00000000..e69de29b diff --git a/scala/project/target/streams/_global/csrProject/_global/streams/out b/scala/project/target/streams/_global/csrProject/_global/streams/out new file mode 100644 index 00000000..e69de29b diff --git a/scala/project/target/streams/_global/dependencyPositions/_global/streams/update_cache_2.12/input_dsp b/scala/project/target/streams/_global/dependencyPositions/_global/streams/update_cache_2.12/input_dsp new file mode 100644 index 00000000..b763df57 --- /dev/null +++ b/scala/project/target/streams/_global/dependencyPositions/_global/streams/update_cache_2.12/input_dsp @@ -0,0 +1 @@ +86562848 \ No newline at end of file diff --git a/scala/project/target/streams/_global/dependencyPositions/_global/streams/update_cache_2.12/output_dsp b/scala/project/target/streams/_global/dependencyPositions/_global/streams/update_cache_2.12/output_dsp new file mode 100644 index 00000000..52065aa3 --- /dev/null +++ b/scala/project/target/streams/_global/dependencyPositions/_global/streams/update_cache_2.12/output_dsp @@ -0,0 +1 @@ +{"{\"organization\":\"org.scala-lang\",\"name\":\"scala-library\",\"revision\":\"2.12.12\",\"configurations\":\"provided\",\"isChanging\":false,\"isTransitive\":true,\"isForce\":false,\"explicitArtifacts\":[],\"inclusions\":[],\"exclusions\":[],\"extraAttributes\":{},\"crossVersion\":{\"type\":\"Disabled\"}}":{"value":{"$fields":["path","startLine"],"path":"(sbt.Classpaths.jvmBaseSettings) Defaults.scala","startLine":3090},"type":"LinePosition"}} \ No newline at end of file diff --git a/scala/project/target/streams/_global/ivyConfiguration/_global/streams/out b/scala/project/target/streams/_global/ivyConfiguration/_global/streams/out new file mode 100644 index 00000000..e69de29b diff --git a/scala/project/target/streams/_global/ivySbt/_global/streams/out b/scala/project/target/streams/_global/ivySbt/_global/streams/out new file mode 100644 index 00000000..e69de29b diff --git a/scala/project/target/streams/_global/moduleSettings/_global/streams/out b/scala/project/target/streams/_global/moduleSettings/_global/streams/out new file mode 100644 index 00000000..e69de29b diff --git a/scala/project/target/streams/_global/projectDescriptors/_global/streams/out b/scala/project/target/streams/_global/projectDescriptors/_global/streams/out new file mode 100644 index 00000000..e69de29b diff --git a/scala/project/target/streams/_global/scalaCompilerBridgeScope/_global/streams/out b/scala/project/target/streams/_global/scalaCompilerBridgeScope/_global/streams/out new file mode 100644 index 00000000..e69de29b diff --git a/scala/project/target/streams/_global/update/_global/streams/out b/scala/project/target/streams/_global/update/_global/streams/out new file mode 100644 index 00000000..8c6883a8 --- /dev/null +++ b/scala/project/target/streams/_global/update/_global/streams/out @@ -0,0 +1,3 @@ +[debug] not up to date. inChanged = true, force = false +[debug] Updating ProjectRef(uri("file:/Users/ricardo.portilla/Downloads/tempo/scala/project/"), "scala-build")... +[debug] Done updating ProjectRef(uri("file:/Users/ricardo.portilla/Downloads/tempo/scala/project/"), "scala-build") diff --git a/scala/project/target/streams/compile/_global/_global/compileOutputs/previous b/scala/project/target/streams/compile/_global/_global/compileOutputs/previous new file mode 100644 index 00000000..82dc25fd --- /dev/null +++ b/scala/project/target/streams/compile/_global/_global/compileOutputs/previous @@ -0,0 +1 @@ +["sbt.Task[scala.collection.Seq[java.nio.file.Path]]",["/Users/ricardo.portilla/Downloads/tempo/scala/project/target/scala-2.12/sbt-1.0/zinc/inc_compile_2.12.zip"]] \ No newline at end of file diff --git a/scala/project/target/streams/compile/_global/_global/discoveredMainClasses/data b/scala/project/target/streams/compile/_global/_global/discoveredMainClasses/data new file mode 100644 index 00000000..0637a088 --- /dev/null +++ b/scala/project/target/streams/compile/_global/_global/discoveredMainClasses/data @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/scala/project/target/streams/compile/bspReporter/_global/streams/out b/scala/project/target/streams/compile/bspReporter/_global/streams/out new file mode 100644 index 00000000..e69de29b diff --git a/scala/project/target/streams/compile/compile/_global/streams/out b/scala/project/target/streams/compile/compile/_global/streams/out new file mode 100644 index 00000000..e69de29b diff --git a/scala/project/target/streams/compile/compileIncremental/_global/streams/export b/scala/project/target/streams/compile/compileIncremental/_global/streams/export new file mode 100644 index 00000000..e69de29b diff --git a/scala/project/target/streams/compile/compileIncremental/_global/streams/out b/scala/project/target/streams/compile/compileIncremental/_global/streams/out new file mode 100644 index 00000000..5db86870 --- /dev/null +++ b/scala/project/target/streams/compile/compileIncremental/_global/streams/out @@ -0,0 +1,6 @@ +[debug] [zinc] IncrementalCompile ----------- +[debug] IncrementalCompile.incrementalCompile +[debug] previous = Stamps for: 0 products, 0 sources, 0 libraries +[debug] current source = Set() +[debug] > initialChanges = InitialChanges(Changes(added = Set(), removed = Set(), changed = Set(), unmodified = ...),Set(),Set(),API Changes: Set()) +[debug] Full compilation, no sources in previous analysis. diff --git a/scala/project/target/streams/compile/copyResources/_global/streams/copy-resources b/scala/project/target/streams/compile/copyResources/_global/streams/copy-resources new file mode 100644 index 00000000..9d348e7b --- /dev/null +++ b/scala/project/target/streams/compile/copyResources/_global/streams/copy-resources @@ -0,0 +1 @@ +[[{},{}],{}] \ No newline at end of file diff --git a/scala/project/target/streams/compile/copyResources/_global/streams/out b/scala/project/target/streams/compile/copyResources/_global/streams/out new file mode 100644 index 00000000..49995276 --- /dev/null +++ b/scala/project/target/streams/compile/copyResources/_global/streams/out @@ -0,0 +1,2 @@ +[debug] Copy resource mappings: +[debug] diff --git a/scala/project/target/streams/compile/dependencyClasspath/_global/streams/export b/scala/project/target/streams/compile/dependencyClasspath/_global/streams/export new file mode 100644 index 00000000..963b794c --- /dev/null +++ b/scala/project/target/streams/compile/dependencyClasspath/_global/streams/export @@ -0,0 +1 @@ +/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/lib/scala-library.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/lib/scala-compiler.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/lib/scala-reflect.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/lib/scala-xml_2.12.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/util-relation_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/util-interface-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-persist-core-assembly-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/sbt-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/main_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/shaded-jawn-parser_2.12-0.9.1.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/log4j-api-2.11.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/okhttp-3.14.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/util-position_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/task-system_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/gigahorse-core_2.12-0.5.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/util-cache_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jline-reader-3.19.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/slf4j-api-1.7.26.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/testing_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/sbinary_2.12-0.5.1.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/error_prone_annotations-2.4.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/test-interface-1.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/launcher-interface-1.1.6.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jline-terminal-3.19.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/test-agent-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/config-1.3.3.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/io_2.12-1.4.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-lm-integration_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/sjson-new-core_2.12-0.9.1.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/scala-reflect-2.12.12.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/log4j-slf4j-impl-2.11.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/scala-collection-compat_2.12-2.3.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/compiler-interface-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/checker-qual-3.4.1.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/log4j-core-2.11.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/caffeine-2.8.5.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/ssl-config-core_2.12-0.4.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/completion_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-classpath_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jline-2.14.7-sbt-a1b0ffbb8f64bb820f4f84a0c07a0c0964507493.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jline-terminal-jna-3.19.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-persist_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/util-tracking_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jline-terminal-jansi-3.19.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-core_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/scala-parser-combinators_2.12-1.1.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/compiler-bridge_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/scala-xml_2.12-1.3.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jansi-2.1.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jna-platform-5.5.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/okhttp-urlconnection-3.7.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/reactive-streams-1.0.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/disruptor-3.4.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jline-builtins-3.19.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-apiinfo_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/lm-coursier-shaded_2.12-2.0.6.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jna-5.5.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/sjson-new-murmurhash_2.12-0.9.1.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/template-resolver-0.1.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/file-tree-views-2.1.6.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/ipcsocket-1.3.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-compile-core_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/protocol_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/run_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/gigahorse-okhttp_2.12-0.5.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/util-logging_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/sjson-new-scalajson_2.12-0.9.1.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/util-control_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jsch-0.1.54.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/core-macros_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-classfile_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jline-style-3.19.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/okio-1.17.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/librarymanagement-core_2.12-1.4.3.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/actions_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/main-settings_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/ivy-2.3.0-sbt-fbc4f586aeeb1591710b14eb4f41b94880dcd745.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zero-allocation-hashing-0.10.1.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/command_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/tasks_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-compile_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/librarymanagement-ivy_2.12-1.4.3.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/scripted-plugin_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/shaded-scalajson_2.12-1.0.0-M4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/collections_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/logic_2.12-1.4.9.jar diff --git a/scala/project/target/streams/compile/exportedProducts/_global/streams/export b/scala/project/target/streams/compile/exportedProducts/_global/streams/export new file mode 100644 index 00000000..c1a6fded --- /dev/null +++ b/scala/project/target/streams/compile/exportedProducts/_global/streams/export @@ -0,0 +1 @@ +/Users/ricardo.portilla/Downloads/tempo/scala/project/target/scala-2.12/sbt-1.0/classes diff --git a/scala/project/target/streams/compile/externalDependencyClasspath/_global/streams/export b/scala/project/target/streams/compile/externalDependencyClasspath/_global/streams/export new file mode 100644 index 00000000..963b794c --- /dev/null +++ b/scala/project/target/streams/compile/externalDependencyClasspath/_global/streams/export @@ -0,0 +1 @@ +/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/lib/scala-library.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/lib/scala-compiler.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/lib/scala-reflect.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/lib/scala-xml_2.12.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/util-relation_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/util-interface-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-persist-core-assembly-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/sbt-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/main_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/shaded-jawn-parser_2.12-0.9.1.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/log4j-api-2.11.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/okhttp-3.14.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/util-position_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/task-system_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/gigahorse-core_2.12-0.5.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/util-cache_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jline-reader-3.19.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/slf4j-api-1.7.26.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/testing_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/sbinary_2.12-0.5.1.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/error_prone_annotations-2.4.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/test-interface-1.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/launcher-interface-1.1.6.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jline-terminal-3.19.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/test-agent-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/config-1.3.3.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/io_2.12-1.4.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-lm-integration_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/sjson-new-core_2.12-0.9.1.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/scala-reflect-2.12.12.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/log4j-slf4j-impl-2.11.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/scala-collection-compat_2.12-2.3.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/compiler-interface-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/checker-qual-3.4.1.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/log4j-core-2.11.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/caffeine-2.8.5.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/ssl-config-core_2.12-0.4.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/completion_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-classpath_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jline-2.14.7-sbt-a1b0ffbb8f64bb820f4f84a0c07a0c0964507493.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jline-terminal-jna-3.19.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-persist_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/util-tracking_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jline-terminal-jansi-3.19.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-core_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/scala-parser-combinators_2.12-1.1.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/compiler-bridge_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/scala-xml_2.12-1.3.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jansi-2.1.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jna-platform-5.5.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/okhttp-urlconnection-3.7.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/reactive-streams-1.0.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/disruptor-3.4.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jline-builtins-3.19.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-apiinfo_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/lm-coursier-shaded_2.12-2.0.6.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jna-5.5.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/sjson-new-murmurhash_2.12-0.9.1.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/template-resolver-0.1.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/file-tree-views-2.1.6.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/ipcsocket-1.3.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-compile-core_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/protocol_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/run_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/gigahorse-okhttp_2.12-0.5.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/util-logging_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/sjson-new-scalajson_2.12-0.9.1.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/util-control_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jsch-0.1.54.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/core-macros_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-classfile_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jline-style-3.19.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/okio-1.17.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/librarymanagement-core_2.12-1.4.3.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/actions_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/main-settings_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/ivy-2.3.0-sbt-fbc4f586aeeb1591710b14eb4f41b94880dcd745.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zero-allocation-hashing-0.10.1.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/command_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/tasks_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-compile_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/librarymanagement-ivy_2.12-1.4.3.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/scripted-plugin_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/shaded-scalajson_2.12-1.0.0-M4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/collections_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/logic_2.12-1.4.9.jar diff --git a/scala/project/target/streams/compile/incOptions/_global/streams/out b/scala/project/target/streams/compile/incOptions/_global/streams/out new file mode 100644 index 00000000..e5e83643 --- /dev/null +++ b/scala/project/target/streams/compile/incOptions/_global/streams/out @@ -0,0 +1,2 @@ +[debug] Created transactional ClassFileManager with tempDir = /Users/ricardo.portilla/Downloads/tempo/scala/project/target/scala-2.12/sbt-1.0/classes.bak +[debug] Removing the temporary directory used for backing up class files: /Users/ricardo.portilla/Downloads/tempo/scala/project/target/scala-2.12/sbt-1.0/classes.bak diff --git a/scala/project/target/streams/compile/internalDependencyClasspath/_global/streams/export b/scala/project/target/streams/compile/internalDependencyClasspath/_global/streams/export new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/scala/project/target/streams/compile/internalDependencyClasspath/_global/streams/export @@ -0,0 +1 @@ + diff --git a/scala/project/target/streams/compile/internalDependencyClasspath/_global/streams/out b/scala/project/target/streams/compile/internalDependencyClasspath/_global/streams/out new file mode 100644 index 00000000..e69de29b diff --git a/scala/project/target/streams/compile/managedClasspath/_global/streams/export b/scala/project/target/streams/compile/managedClasspath/_global/streams/export new file mode 100644 index 00000000..963b794c --- /dev/null +++ b/scala/project/target/streams/compile/managedClasspath/_global/streams/export @@ -0,0 +1 @@ +/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/lib/scala-library.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/lib/scala-compiler.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/lib/scala-reflect.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/lib/scala-xml_2.12.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/util-relation_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/util-interface-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-persist-core-assembly-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/sbt-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/main_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/shaded-jawn-parser_2.12-0.9.1.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/log4j-api-2.11.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/okhttp-3.14.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/util-position_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/task-system_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/gigahorse-core_2.12-0.5.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/util-cache_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jline-reader-3.19.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/slf4j-api-1.7.26.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/testing_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/sbinary_2.12-0.5.1.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/error_prone_annotations-2.4.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/test-interface-1.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/launcher-interface-1.1.6.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jline-terminal-3.19.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/test-agent-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/config-1.3.3.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/io_2.12-1.4.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-lm-integration_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/sjson-new-core_2.12-0.9.1.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/scala-reflect-2.12.12.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/log4j-slf4j-impl-2.11.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/scala-collection-compat_2.12-2.3.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/compiler-interface-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/checker-qual-3.4.1.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/log4j-core-2.11.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/caffeine-2.8.5.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/ssl-config-core_2.12-0.4.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/completion_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-classpath_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jline-2.14.7-sbt-a1b0ffbb8f64bb820f4f84a0c07a0c0964507493.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jline-terminal-jna-3.19.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-persist_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/util-tracking_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jline-terminal-jansi-3.19.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-core_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/scala-parser-combinators_2.12-1.1.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/compiler-bridge_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/scala-xml_2.12-1.3.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jansi-2.1.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jna-platform-5.5.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/okhttp-urlconnection-3.7.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/reactive-streams-1.0.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/disruptor-3.4.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jline-builtins-3.19.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-apiinfo_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/lm-coursier-shaded_2.12-2.0.6.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jna-5.5.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/sjson-new-murmurhash_2.12-0.9.1.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/template-resolver-0.1.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/file-tree-views-2.1.6.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/ipcsocket-1.3.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-compile-core_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/protocol_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/run_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/gigahorse-okhttp_2.12-0.5.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/util-logging_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/sjson-new-scalajson_2.12-0.9.1.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/util-control_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jsch-0.1.54.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/core-macros_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-classfile_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jline-style-3.19.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/okio-1.17.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/librarymanagement-core_2.12-1.4.3.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/actions_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/main-settings_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/ivy-2.3.0-sbt-fbc4f586aeeb1591710b14eb4f41b94880dcd745.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zero-allocation-hashing-0.10.1.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/command_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/tasks_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-compile_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/librarymanagement-ivy_2.12-1.4.3.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/scripted-plugin_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/shaded-scalajson_2.12-1.0.0-M4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/collections_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/logic_2.12-1.4.9.jar diff --git a/scala/project/target/streams/compile/scalacOptions/_global/streams/out b/scala/project/target/streams/compile/scalacOptions/_global/streams/out new file mode 100644 index 00000000..e69de29b diff --git a/scala/project/target/streams/compile/unmanagedClasspath/_global/streams/export b/scala/project/target/streams/compile/unmanagedClasspath/_global/streams/export new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/scala/project/target/streams/compile/unmanagedClasspath/_global/streams/export @@ -0,0 +1 @@ + diff --git a/scala/project/target/streams/compile/unmanagedClasspath/_global/streams/out b/scala/project/target/streams/compile/unmanagedClasspath/_global/streams/out new file mode 100644 index 00000000..e69de29b diff --git a/scala/project/target/streams/compile/unmanagedJars/_global/streams/export b/scala/project/target/streams/compile/unmanagedJars/_global/streams/export new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/scala/project/target/streams/compile/unmanagedJars/_global/streams/export @@ -0,0 +1 @@ + diff --git a/scala/project/target/streams/runtime/dependencyClasspath/_global/streams/export b/scala/project/target/streams/runtime/dependencyClasspath/_global/streams/export new file mode 100644 index 00000000..e108aa3f --- /dev/null +++ b/scala/project/target/streams/runtime/dependencyClasspath/_global/streams/export @@ -0,0 +1 @@ +/Users/ricardo.portilla/Downloads/tempo/scala/project/target/scala-2.12/sbt-1.0/classes:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/lib/scala-library.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/lib/scala-compiler.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/lib/scala-reflect.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/lib/scala-xml_2.12.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/util-relation_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/util-interface-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-persist-core-assembly-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/sbt-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/main_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/shaded-jawn-parser_2.12-0.9.1.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/log4j-api-2.11.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/okhttp-3.14.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/util-position_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/task-system_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/gigahorse-core_2.12-0.5.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/util-cache_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jline-reader-3.19.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/slf4j-api-1.7.26.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/testing_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/sbinary_2.12-0.5.1.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/error_prone_annotations-2.4.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/test-interface-1.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/launcher-interface-1.1.6.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jline-terminal-3.19.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/test-agent-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/config-1.3.3.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/io_2.12-1.4.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-lm-integration_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/sjson-new-core_2.12-0.9.1.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/scala-reflect-2.12.12.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/log4j-slf4j-impl-2.11.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/scala-collection-compat_2.12-2.3.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/compiler-interface-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/checker-qual-3.4.1.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/log4j-core-2.11.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/caffeine-2.8.5.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/ssl-config-core_2.12-0.4.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/completion_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-classpath_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jline-2.14.7-sbt-a1b0ffbb8f64bb820f4f84a0c07a0c0964507493.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jline-terminal-jna-3.19.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-persist_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/util-tracking_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jline-terminal-jansi-3.19.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-core_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/scala-parser-combinators_2.12-1.1.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/compiler-bridge_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/scala-xml_2.12-1.3.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jansi-2.1.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jna-platform-5.5.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/okhttp-urlconnection-3.7.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/reactive-streams-1.0.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/disruptor-3.4.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jline-builtins-3.19.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-apiinfo_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/lm-coursier-shaded_2.12-2.0.6.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jna-5.5.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/sjson-new-murmurhash_2.12-0.9.1.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/template-resolver-0.1.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/file-tree-views-2.1.6.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/ipcsocket-1.3.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-compile-core_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/protocol_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/run_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/gigahorse-okhttp_2.12-0.5.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/util-logging_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/sjson-new-scalajson_2.12-0.9.1.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/util-control_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jsch-0.1.54.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/core-macros_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-classfile_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jline-style-3.19.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/okio-1.17.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/librarymanagement-core_2.12-1.4.3.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/actions_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/main-settings_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/ivy-2.3.0-sbt-fbc4f586aeeb1591710b14eb4f41b94880dcd745.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zero-allocation-hashing-0.10.1.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/command_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/tasks_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-compile_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/librarymanagement-ivy_2.12-1.4.3.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/scripted-plugin_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/shaded-scalajson_2.12-1.0.0-M4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/collections_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/logic_2.12-1.4.9.jar diff --git a/scala/project/target/streams/runtime/exportedProducts/_global/streams/export b/scala/project/target/streams/runtime/exportedProducts/_global/streams/export new file mode 100644 index 00000000..c1a6fded --- /dev/null +++ b/scala/project/target/streams/runtime/exportedProducts/_global/streams/export @@ -0,0 +1 @@ +/Users/ricardo.portilla/Downloads/tempo/scala/project/target/scala-2.12/sbt-1.0/classes diff --git a/scala/project/target/streams/runtime/externalDependencyClasspath/_global/streams/export b/scala/project/target/streams/runtime/externalDependencyClasspath/_global/streams/export new file mode 100644 index 00000000..963b794c --- /dev/null +++ b/scala/project/target/streams/runtime/externalDependencyClasspath/_global/streams/export @@ -0,0 +1 @@ +/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/lib/scala-library.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/lib/scala-compiler.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/lib/scala-reflect.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/lib/scala-xml_2.12.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/util-relation_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/util-interface-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-persist-core-assembly-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/sbt-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/main_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/shaded-jawn-parser_2.12-0.9.1.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/log4j-api-2.11.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/okhttp-3.14.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/util-position_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/task-system_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/gigahorse-core_2.12-0.5.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/util-cache_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jline-reader-3.19.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/slf4j-api-1.7.26.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/testing_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/sbinary_2.12-0.5.1.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/error_prone_annotations-2.4.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/test-interface-1.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/launcher-interface-1.1.6.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jline-terminal-3.19.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/test-agent-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/config-1.3.3.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/io_2.12-1.4.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-lm-integration_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/sjson-new-core_2.12-0.9.1.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/scala-reflect-2.12.12.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/log4j-slf4j-impl-2.11.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/scala-collection-compat_2.12-2.3.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/compiler-interface-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/checker-qual-3.4.1.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/log4j-core-2.11.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/caffeine-2.8.5.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/ssl-config-core_2.12-0.4.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/completion_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-classpath_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jline-2.14.7-sbt-a1b0ffbb8f64bb820f4f84a0c07a0c0964507493.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jline-terminal-jna-3.19.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-persist_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/util-tracking_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jline-terminal-jansi-3.19.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-core_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/scala-parser-combinators_2.12-1.1.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/compiler-bridge_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/scala-xml_2.12-1.3.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jansi-2.1.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jna-platform-5.5.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/okhttp-urlconnection-3.7.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/reactive-streams-1.0.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/disruptor-3.4.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jline-builtins-3.19.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-apiinfo_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/lm-coursier-shaded_2.12-2.0.6.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jna-5.5.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/sjson-new-murmurhash_2.12-0.9.1.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/template-resolver-0.1.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/file-tree-views-2.1.6.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/ipcsocket-1.3.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-compile-core_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/protocol_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/run_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/gigahorse-okhttp_2.12-0.5.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/util-logging_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/sjson-new-scalajson_2.12-0.9.1.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/util-control_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jsch-0.1.54.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/core-macros_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-classfile_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jline-style-3.19.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/okio-1.17.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/librarymanagement-core_2.12-1.4.3.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/actions_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/main-settings_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/ivy-2.3.0-sbt-fbc4f586aeeb1591710b14eb4f41b94880dcd745.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zero-allocation-hashing-0.10.1.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/command_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/tasks_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-compile_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/librarymanagement-ivy_2.12-1.4.3.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/scripted-plugin_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/shaded-scalajson_2.12-1.0.0-M4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/collections_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/logic_2.12-1.4.9.jar diff --git a/scala/project/target/streams/runtime/fullClasspath/_global/streams/export b/scala/project/target/streams/runtime/fullClasspath/_global/streams/export new file mode 100644 index 00000000..e108aa3f --- /dev/null +++ b/scala/project/target/streams/runtime/fullClasspath/_global/streams/export @@ -0,0 +1 @@ +/Users/ricardo.portilla/Downloads/tempo/scala/project/target/scala-2.12/sbt-1.0/classes:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/lib/scala-library.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/lib/scala-compiler.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/lib/scala-reflect.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/lib/scala-xml_2.12.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/util-relation_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/util-interface-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-persist-core-assembly-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/sbt-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/main_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/shaded-jawn-parser_2.12-0.9.1.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/log4j-api-2.11.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/okhttp-3.14.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/util-position_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/task-system_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/gigahorse-core_2.12-0.5.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/util-cache_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jline-reader-3.19.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/slf4j-api-1.7.26.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/testing_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/sbinary_2.12-0.5.1.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/error_prone_annotations-2.4.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/test-interface-1.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/launcher-interface-1.1.6.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jline-terminal-3.19.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/test-agent-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/config-1.3.3.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/io_2.12-1.4.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-lm-integration_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/sjson-new-core_2.12-0.9.1.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/scala-reflect-2.12.12.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/log4j-slf4j-impl-2.11.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/scala-collection-compat_2.12-2.3.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/compiler-interface-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/checker-qual-3.4.1.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/log4j-core-2.11.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/caffeine-2.8.5.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/ssl-config-core_2.12-0.4.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/completion_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-classpath_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jline-2.14.7-sbt-a1b0ffbb8f64bb820f4f84a0c07a0c0964507493.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jline-terminal-jna-3.19.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-persist_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/util-tracking_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jline-terminal-jansi-3.19.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-core_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/scala-parser-combinators_2.12-1.1.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/compiler-bridge_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/scala-xml_2.12-1.3.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jansi-2.1.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jna-platform-5.5.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/okhttp-urlconnection-3.7.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/reactive-streams-1.0.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/disruptor-3.4.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jline-builtins-3.19.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-apiinfo_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/lm-coursier-shaded_2.12-2.0.6.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jna-5.5.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/sjson-new-murmurhash_2.12-0.9.1.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/template-resolver-0.1.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/file-tree-views-2.1.6.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/ipcsocket-1.3.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-compile-core_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/protocol_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/run_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/gigahorse-okhttp_2.12-0.5.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/util-logging_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/sjson-new-scalajson_2.12-0.9.1.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/util-control_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jsch-0.1.54.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/core-macros_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-classfile_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jline-style-3.19.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/okio-1.17.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/librarymanagement-core_2.12-1.4.3.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/actions_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/main-settings_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/ivy-2.3.0-sbt-fbc4f586aeeb1591710b14eb4f41b94880dcd745.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zero-allocation-hashing-0.10.1.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/command_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/tasks_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-compile_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/librarymanagement-ivy_2.12-1.4.3.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/scripted-plugin_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/shaded-scalajson_2.12-1.0.0-M4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/collections_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/logic_2.12-1.4.9.jar diff --git a/scala/project/target/streams/runtime/internalDependencyClasspath/_global/streams/export b/scala/project/target/streams/runtime/internalDependencyClasspath/_global/streams/export new file mode 100644 index 00000000..c1a6fded --- /dev/null +++ b/scala/project/target/streams/runtime/internalDependencyClasspath/_global/streams/export @@ -0,0 +1 @@ +/Users/ricardo.portilla/Downloads/tempo/scala/project/target/scala-2.12/sbt-1.0/classes diff --git a/scala/project/target/streams/runtime/internalDependencyClasspath/_global/streams/out b/scala/project/target/streams/runtime/internalDependencyClasspath/_global/streams/out new file mode 100644 index 00000000..e69de29b diff --git a/scala/project/target/streams/runtime/managedClasspath/_global/streams/export b/scala/project/target/streams/runtime/managedClasspath/_global/streams/export new file mode 100644 index 00000000..963b794c --- /dev/null +++ b/scala/project/target/streams/runtime/managedClasspath/_global/streams/export @@ -0,0 +1 @@ +/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/lib/scala-library.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/lib/scala-compiler.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/lib/scala-reflect.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/lib/scala-xml_2.12.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/util-relation_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/util-interface-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-persist-core-assembly-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/sbt-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/main_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/shaded-jawn-parser_2.12-0.9.1.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/log4j-api-2.11.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/okhttp-3.14.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/util-position_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/task-system_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/gigahorse-core_2.12-0.5.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/util-cache_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jline-reader-3.19.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/slf4j-api-1.7.26.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/testing_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/sbinary_2.12-0.5.1.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/error_prone_annotations-2.4.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/test-interface-1.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/launcher-interface-1.1.6.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jline-terminal-3.19.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/test-agent-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/config-1.3.3.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/io_2.12-1.4.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-lm-integration_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/sjson-new-core_2.12-0.9.1.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/scala-reflect-2.12.12.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/log4j-slf4j-impl-2.11.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/scala-collection-compat_2.12-2.3.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/compiler-interface-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/checker-qual-3.4.1.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/log4j-core-2.11.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/caffeine-2.8.5.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/ssl-config-core_2.12-0.4.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/completion_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-classpath_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jline-2.14.7-sbt-a1b0ffbb8f64bb820f4f84a0c07a0c0964507493.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jline-terminal-jna-3.19.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-persist_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/util-tracking_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jline-terminal-jansi-3.19.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-core_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/scala-parser-combinators_2.12-1.1.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/compiler-bridge_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/scala-xml_2.12-1.3.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jansi-2.1.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jna-platform-5.5.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/okhttp-urlconnection-3.7.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/reactive-streams-1.0.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/disruptor-3.4.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jline-builtins-3.19.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-apiinfo_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/lm-coursier-shaded_2.12-2.0.6.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jna-5.5.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/sjson-new-murmurhash_2.12-0.9.1.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/template-resolver-0.1.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/file-tree-views-2.1.6.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/ipcsocket-1.3.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-compile-core_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/protocol_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/run_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/gigahorse-okhttp_2.12-0.5.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/util-logging_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/sjson-new-scalajson_2.12-0.9.1.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/util-control_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jsch-0.1.54.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/core-macros_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-classfile_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/jline-style-3.19.0.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/okio-1.17.2.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/librarymanagement-core_2.12-1.4.3.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/actions_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/main-settings_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/ivy-2.3.0-sbt-fbc4f586aeeb1591710b14eb4f41b94880dcd745.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zero-allocation-hashing-0.10.1.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/command_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/tasks_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/zinc-compile_2.12-1.4.4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/librarymanagement-ivy_2.12-1.4.3.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/scripted-plugin_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/shaded-scalajson_2.12-1.0.0-M4.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/collections_2.12-1.4.9.jar:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/org.scala-sbt/sbt/1.4.9/logic_2.12-1.4.9.jar diff --git a/scala/project/target/streams/runtime/unmanagedClasspath/_global/streams/export b/scala/project/target/streams/runtime/unmanagedClasspath/_global/streams/export new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/scala/project/target/streams/runtime/unmanagedClasspath/_global/streams/export @@ -0,0 +1 @@ + diff --git a/scala/project/target/streams/runtime/unmanagedClasspath/_global/streams/out b/scala/project/target/streams/runtime/unmanagedClasspath/_global/streams/out new file mode 100644 index 00000000..e69de29b diff --git a/scala/project/target/streams/runtime/unmanagedJars/_global/streams/export b/scala/project/target/streams/runtime/unmanagedJars/_global/streams/export new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/scala/project/target/streams/runtime/unmanagedJars/_global/streams/export @@ -0,0 +1 @@ + diff --git a/scala/target/scala-2.12/scala_2.12-0.1.0-SNAPSHOT.jar b/scala/target/scala-2.12/scala_2.12-0.1.0-SNAPSHOT.jar new file mode 100644 index 0000000000000000000000000000000000000000..209ec82a3e6a779c41b5eb0f8227d5634af18b7f GIT binary patch literal 275 zcmWIWW@Zs#;Nak3U|>+R0TOT^!ob4d>l)&y>*?pF@9XI2>E;?7qUY=O?-T>WXWuiY zeY|z`F7kToYMncCeshq)72^j_x%51I&-tA8@zY`KdfApT?a7iTO%ZkVXDW+MAN(r$ zg0b`!+iy!Ymg*nv30kMUPwH<9^6>Qa);X*B@ad;Bx+gr(`kvK3n8rFw#n0N{%ERp} zO6y initialChanges = InitialChanges(Changes(added = Set(), removed = Set(), changed = Set(), unmodified = ...),Set(),Set(),API Changes: Set()) +[debug] Full compilation, no sources in previous analysis. diff --git a/scala/target/streams/compile/copyResources/_global/streams/copy-resources b/scala/target/streams/compile/copyResources/_global/streams/copy-resources new file mode 100644 index 00000000..9d348e7b --- /dev/null +++ b/scala/target/streams/compile/copyResources/_global/streams/copy-resources @@ -0,0 +1 @@ +[[{},{}],{}] \ No newline at end of file diff --git a/scala/target/streams/compile/copyResources/_global/streams/out b/scala/target/streams/compile/copyResources/_global/streams/out new file mode 100644 index 00000000..49995276 --- /dev/null +++ b/scala/target/streams/compile/copyResources/_global/streams/out @@ -0,0 +1,2 @@ +[debug] Copy resource mappings: +[debug] diff --git a/scala/target/streams/compile/dependencyClasspath/_global/streams/export b/scala/target/streams/compile/dependencyClasspath/_global/streams/export new file mode 100644 index 00000000..106dbd32 --- /dev/null +++ b/scala/target/streams/compile/dependencyClasspath/_global/streams/export @@ -0,0 +1 @@ +/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/lib/scala-library.jar diff --git a/scala/target/streams/compile/exportedProducts/_global/streams/export b/scala/target/streams/compile/exportedProducts/_global/streams/export new file mode 100644 index 00000000..eada49ea --- /dev/null +++ b/scala/target/streams/compile/exportedProducts/_global/streams/export @@ -0,0 +1 @@ +/Users/ricardo.portilla/Downloads/tempo/scala/target/scala-2.12/classes diff --git a/scala/target/streams/compile/externalDependencyClasspath/_global/streams/export b/scala/target/streams/compile/externalDependencyClasspath/_global/streams/export new file mode 100644 index 00000000..106dbd32 --- /dev/null +++ b/scala/target/streams/compile/externalDependencyClasspath/_global/streams/export @@ -0,0 +1 @@ +/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/lib/scala-library.jar diff --git a/scala/target/streams/compile/incOptions/_global/streams/out b/scala/target/streams/compile/incOptions/_global/streams/out new file mode 100644 index 00000000..221af683 --- /dev/null +++ b/scala/target/streams/compile/incOptions/_global/streams/out @@ -0,0 +1,2 @@ +[debug] Created transactional ClassFileManager with tempDir = /Users/ricardo.portilla/Downloads/tempo/scala/target/scala-2.12/classes.bak +[debug] Removing the temporary directory used for backing up class files: /Users/ricardo.portilla/Downloads/tempo/scala/target/scala-2.12/classes.bak diff --git a/scala/target/streams/compile/internalDependencyClasspath/_global/streams/export b/scala/target/streams/compile/internalDependencyClasspath/_global/streams/export new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/scala/target/streams/compile/internalDependencyClasspath/_global/streams/export @@ -0,0 +1 @@ + diff --git a/scala/target/streams/compile/internalDependencyClasspath/_global/streams/out b/scala/target/streams/compile/internalDependencyClasspath/_global/streams/out new file mode 100644 index 00000000..e69de29b diff --git a/scala/target/streams/compile/mainClass/_global/streams/out b/scala/target/streams/compile/mainClass/_global/streams/out new file mode 100644 index 00000000..e69de29b diff --git a/scala/target/streams/compile/managedClasspath/_global/streams/export b/scala/target/streams/compile/managedClasspath/_global/streams/export new file mode 100644 index 00000000..106dbd32 --- /dev/null +++ b/scala/target/streams/compile/managedClasspath/_global/streams/export @@ -0,0 +1 @@ +/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/lib/scala-library.jar diff --git a/scala/target/streams/compile/packageBin/_global/streams/inputs b/scala/target/streams/compile/packageBin/_global/streams/inputs new file mode 100644 index 00000000..9332d732 --- /dev/null +++ b/scala/target/streams/compile/packageBin/_global/streams/inputs @@ -0,0 +1 @@ +340345967 \ No newline at end of file diff --git a/scala/target/streams/compile/packageBin/_global/streams/out b/scala/target/streams/compile/packageBin/_global/streams/out new file mode 100644 index 00000000..8b06fb90 --- /dev/null +++ b/scala/target/streams/compile/packageBin/_global/streams/out @@ -0,0 +1,4 @@ +[debug] Packaging /Users/ricardo.portilla/Downloads/tempo/scala/target/scala-2.12/scala_2.12-0.1.0-SNAPSHOT.jar ... +[debug] Input file mappings: +[debug] +[debug] Done packaging. diff --git a/scala/target/streams/compile/packageBin/_global/streams/output b/scala/target/streams/compile/packageBin/_global/streams/output new file mode 100644 index 00000000..870f468d --- /dev/null +++ b/scala/target/streams/compile/packageBin/_global/streams/output @@ -0,0 +1 @@ +-1094937831 \ No newline at end of file diff --git a/scala/target/streams/compile/scalacOptions/_global/streams/out b/scala/target/streams/compile/scalacOptions/_global/streams/out new file mode 100644 index 00000000..e69de29b diff --git a/scala/target/streams/compile/unmanagedClasspath/_global/streams/export b/scala/target/streams/compile/unmanagedClasspath/_global/streams/export new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/scala/target/streams/compile/unmanagedClasspath/_global/streams/export @@ -0,0 +1 @@ + diff --git a/scala/target/streams/compile/unmanagedClasspath/_global/streams/out b/scala/target/streams/compile/unmanagedClasspath/_global/streams/out new file mode 100644 index 00000000..e69de29b diff --git a/scala/target/streams/compile/unmanagedJars/_global/streams/export b/scala/target/streams/compile/unmanagedJars/_global/streams/export new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/scala/target/streams/compile/unmanagedJars/_global/streams/export @@ -0,0 +1 @@ + diff --git a/scala/target/streams/runtime/exportedProducts/_global/streams/export b/scala/target/streams/runtime/exportedProducts/_global/streams/export new file mode 100644 index 00000000..eada49ea --- /dev/null +++ b/scala/target/streams/runtime/exportedProducts/_global/streams/export @@ -0,0 +1 @@ +/Users/ricardo.portilla/Downloads/tempo/scala/target/scala-2.12/classes diff --git a/scala/target/streams/runtime/unmanagedJars/_global/streams/export b/scala/target/streams/runtime/unmanagedJars/_global/streams/export new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/scala/target/streams/runtime/unmanagedJars/_global/streams/export @@ -0,0 +1 @@ + diff --git a/scala/target/streams/test/_global/_global/compileOutputs/previous b/scala/target/streams/test/_global/_global/compileOutputs/previous new file mode 100644 index 00000000..cea65a93 --- /dev/null +++ b/scala/target/streams/test/_global/_global/compileOutputs/previous @@ -0,0 +1 @@ +["sbt.Task[scala.collection.Seq[java.nio.file.Path]]",["/Users/ricardo.portilla/Downloads/tempo/scala/target/scala-2.12/test-zinc/inc_compile_2.12.zip"]] \ No newline at end of file diff --git a/scala/target/streams/test/_global/_global/definedTestNames/data b/scala/target/streams/test/_global/_global/definedTestNames/data new file mode 100644 index 00000000..0637a088 --- /dev/null +++ b/scala/target/streams/test/_global/_global/definedTestNames/data @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/scala/target/streams/test/_global/_global/dependencyClasspathFiles/previous b/scala/target/streams/test/_global/_global/dependencyClasspathFiles/previous new file mode 100644 index 00000000..8a75ec53 --- /dev/null +++ b/scala/target/streams/test/_global/_global/dependencyClasspathFiles/previous @@ -0,0 +1 @@ +["sbt.Task[scala.collection.Seq[java.nio.file.Path]]",["/Users/ricardo.portilla/Downloads/tempo/scala/target/scala-2.12/classes","/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/lib/scala-library.jar"]] \ No newline at end of file diff --git a/scala/target/streams/test/_global/_global/discoveredMainClasses/data b/scala/target/streams/test/_global/_global/discoveredMainClasses/data new file mode 100644 index 00000000..0637a088 --- /dev/null +++ b/scala/target/streams/test/_global/_global/discoveredMainClasses/data @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/scala/target/streams/test/bspReporter/_global/streams/out b/scala/target/streams/test/bspReporter/_global/streams/out new file mode 100644 index 00000000..e69de29b diff --git a/scala/target/streams/test/compile/_global/streams/out b/scala/target/streams/test/compile/_global/streams/out new file mode 100644 index 00000000..e69de29b diff --git a/scala/target/streams/test/compileIncremental/_global/streams/export b/scala/target/streams/test/compileIncremental/_global/streams/export new file mode 100644 index 00000000..e69de29b diff --git a/scala/target/streams/test/compileIncremental/_global/streams/out b/scala/target/streams/test/compileIncremental/_global/streams/out new file mode 100644 index 00000000..5db86870 --- /dev/null +++ b/scala/target/streams/test/compileIncremental/_global/streams/out @@ -0,0 +1,6 @@ +[debug] [zinc] IncrementalCompile ----------- +[debug] IncrementalCompile.incrementalCompile +[debug] previous = Stamps for: 0 products, 0 sources, 0 libraries +[debug] current source = Set() +[debug] > initialChanges = InitialChanges(Changes(added = Set(), removed = Set(), changed = Set(), unmodified = ...),Set(),Set(),API Changes: Set()) +[debug] Full compilation, no sources in previous analysis. diff --git a/scala/target/streams/test/copyResources/_global/streams/copy-resources b/scala/target/streams/test/copyResources/_global/streams/copy-resources new file mode 100644 index 00000000..9d348e7b --- /dev/null +++ b/scala/target/streams/test/copyResources/_global/streams/copy-resources @@ -0,0 +1 @@ +[[{},{}],{}] \ No newline at end of file diff --git a/scala/target/streams/test/copyResources/_global/streams/out b/scala/target/streams/test/copyResources/_global/streams/out new file mode 100644 index 00000000..49995276 --- /dev/null +++ b/scala/target/streams/test/copyResources/_global/streams/out @@ -0,0 +1,2 @@ +[debug] Copy resource mappings: +[debug] diff --git a/scala/target/streams/test/definedTests/_global/streams/out b/scala/target/streams/test/definedTests/_global/streams/out new file mode 100644 index 00000000..bf899f07 --- /dev/null +++ b/scala/target/streams/test/definedTests/_global/streams/out @@ -0,0 +1,2 @@ +[debug] Subclass fingerprints: List() +[debug] Annotation fingerprints: List() diff --git a/scala/target/streams/test/dependencyClasspath/_global/streams/export b/scala/target/streams/test/dependencyClasspath/_global/streams/export new file mode 100644 index 00000000..20db1a57 --- /dev/null +++ b/scala/target/streams/test/dependencyClasspath/_global/streams/export @@ -0,0 +1 @@ +/Users/ricardo.portilla/Downloads/tempo/scala/target/scala-2.12/classes:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/lib/scala-library.jar diff --git a/scala/target/streams/test/exportedProducts/_global/streams/export b/scala/target/streams/test/exportedProducts/_global/streams/export new file mode 100644 index 00000000..b0e5348a --- /dev/null +++ b/scala/target/streams/test/exportedProducts/_global/streams/export @@ -0,0 +1 @@ +/Users/ricardo.portilla/Downloads/tempo/scala/target/scala-2.12/test-classes diff --git a/scala/target/streams/test/externalDependencyClasspath/_global/streams/export b/scala/target/streams/test/externalDependencyClasspath/_global/streams/export new file mode 100644 index 00000000..106dbd32 --- /dev/null +++ b/scala/target/streams/test/externalDependencyClasspath/_global/streams/export @@ -0,0 +1 @@ +/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/lib/scala-library.jar diff --git a/scala/target/streams/test/fullClasspath/_global/streams/export b/scala/target/streams/test/fullClasspath/_global/streams/export new file mode 100644 index 00000000..938b07cf --- /dev/null +++ b/scala/target/streams/test/fullClasspath/_global/streams/export @@ -0,0 +1 @@ +/Users/ricardo.portilla/Downloads/tempo/scala/target/scala-2.12/test-classes:/Users/ricardo.portilla/Downloads/tempo/scala/target/scala-2.12/classes:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/lib/scala-library.jar diff --git a/scala/target/streams/test/incOptions/_global/streams/out b/scala/target/streams/test/incOptions/_global/streams/out new file mode 100644 index 00000000..eab37cca --- /dev/null +++ b/scala/target/streams/test/incOptions/_global/streams/out @@ -0,0 +1,2 @@ +[debug] Created transactional ClassFileManager with tempDir = /Users/ricardo.portilla/Downloads/tempo/scala/target/scala-2.12/test-classes.bak +[debug] Removing the temporary directory used for backing up class files: /Users/ricardo.portilla/Downloads/tempo/scala/target/scala-2.12/test-classes.bak diff --git a/scala/target/streams/test/internalDependencyClasspath/_global/streams/export b/scala/target/streams/test/internalDependencyClasspath/_global/streams/export new file mode 100644 index 00000000..eada49ea --- /dev/null +++ b/scala/target/streams/test/internalDependencyClasspath/_global/streams/export @@ -0,0 +1 @@ +/Users/ricardo.portilla/Downloads/tempo/scala/target/scala-2.12/classes diff --git a/scala/target/streams/test/internalDependencyClasspath/_global/streams/out b/scala/target/streams/test/internalDependencyClasspath/_global/streams/out new file mode 100644 index 00000000..e69de29b diff --git a/scala/target/streams/test/loadedTestFrameworks/_global/streams/out b/scala/target/streams/test/loadedTestFrameworks/_global/streams/out new file mode 100644 index 00000000..16f17d6e --- /dev/null +++ b/scala/target/streams/test/loadedTestFrameworks/_global/streams/out @@ -0,0 +1,7 @@ +[debug] Framework implementation 'org.scalacheck.ScalaCheckFramework' not present. +[debug] Framework implementation 'org.specs2.runner.Specs2Framework' not present. +[debug] Framework implementation 'org.specs2.runner.SpecsFramework' not present. +[debug] Framework implementation 'org.specs.runner.SpecsFramework' not present. +[debug] Framework implementation 'org.scalatest.tools.Framework' not present. +[debug] Framework implementation 'org.scalatest.tools.ScalaTestFramework' not present. +[debug] Framework implementation 'com.novocode.junit.JUnitFramework' not present. diff --git a/scala/target/streams/test/managedClasspath/_global/streams/export b/scala/target/streams/test/managedClasspath/_global/streams/export new file mode 100644 index 00000000..106dbd32 --- /dev/null +++ b/scala/target/streams/test/managedClasspath/_global/streams/export @@ -0,0 +1 @@ +/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/lib/scala-library.jar diff --git a/scala/target/streams/test/scalacOptions/_global/streams/out b/scala/target/streams/test/scalacOptions/_global/streams/out new file mode 100644 index 00000000..e69de29b diff --git a/scala/target/streams/test/test/_global/streams/out b/scala/target/streams/test/test/_global/streams/out new file mode 100644 index 00000000..e69de29b diff --git a/scala/target/streams/test/unmanagedClasspath/_global/streams/export b/scala/target/streams/test/unmanagedClasspath/_global/streams/export new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/scala/target/streams/test/unmanagedClasspath/_global/streams/export @@ -0,0 +1 @@ + diff --git a/scala/target/streams/test/unmanagedClasspath/_global/streams/out b/scala/target/streams/test/unmanagedClasspath/_global/streams/out new file mode 100644 index 00000000..e69de29b diff --git a/scala/target/streams/test/unmanagedJars/_global/streams/export b/scala/target/streams/test/unmanagedJars/_global/streams/export new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/scala/target/streams/test/unmanagedJars/_global/streams/export @@ -0,0 +1 @@ + From c874d1cb75e06ac39d82b80ddb367f170f58d0a8 Mon Sep 17 00:00:00 2001 From: Ricardo Portilla Date: Sun, 15 Aug 2021 21:07:27 -0400 Subject: [PATCH 08/39] removing streams --- .gitignore | 1 + scala/target/streams/_global/_global/_global/streams/out | 0 .../streams/_global/_global/csrLogger/_global/streams/out | 0 .../streams/_global/csrConfiguration/_global/streams/out | 0 .../target/streams/_global/csrProject/_global/streams/out | 0 .../_global/streams/update_cache_2.12/input_dsp | 1 - .../_global/streams/update_cache_2.12/output_dsp | 1 - .../streams/_global/ivyConfiguration/_global/streams/out | 0 scala/target/streams/_global/ivySbt/_global/streams/out | 0 .../streams/_global/moduleSettings/_global/streams/out | 0 .../streams/_global/projectDescriptors/_global/streams/out | 0 .../_global/scalaCompilerBridgeScope/_global/streams/out | 0 .../streams/_global/testListeners/_global/streams/out | 0 scala/target/streams/_global/update/_global/streams/out | 3 --- .../compile/_global/_global/compileOutputs/previous | 1 - .../compile/_global/_global/discoveredMainClasses/data | 1 - .../target/streams/compile/bspReporter/_global/streams/out | 0 scala/target/streams/compile/compile/_global/streams/out | 0 .../compile/compileIncremental/_global/streams/export | 0 .../streams/compile/compileIncremental/_global/streams/out | 6 ------ .../compile/copyResources/_global/streams/copy-resources | 1 - .../streams/compile/copyResources/_global/streams/out | 2 -- .../compile/dependencyClasspath/_global/streams/export | 1 - .../compile/exportedProducts/_global/streams/export | 1 - .../externalDependencyClasspath/_global/streams/export | 1 - .../target/streams/compile/incOptions/_global/streams/out | 2 -- .../internalDependencyClasspath/_global/streams/export | 1 - .../internalDependencyClasspath/_global/streams/out | 0 scala/target/streams/compile/mainClass/_global/streams/out | 0 .../compile/managedClasspath/_global/streams/export | 1 - .../streams/compile/packageBin/_global/streams/inputs | 1 - .../target/streams/compile/packageBin/_global/streams/out | 4 ---- .../streams/compile/packageBin/_global/streams/output | 1 - .../streams/compile/scalacOptions/_global/streams/out | 0 .../compile/unmanagedClasspath/_global/streams/export | 1 - .../streams/compile/unmanagedClasspath/_global/streams/out | 0 .../streams/compile/unmanagedJars/_global/streams/export | 1 - .../runtime/exportedProducts/_global/streams/export | 1 - .../streams/runtime/unmanagedJars/_global/streams/export | 1 - .../streams/test/_global/_global/compileOutputs/previous | 1 - .../streams/test/_global/_global/definedTestNames/data | 1 - .../test/_global/_global/dependencyClasspathFiles/previous | 1 - .../test/_global/_global/discoveredMainClasses/data | 1 - scala/target/streams/test/bspReporter/_global/streams/out | 0 scala/target/streams/test/compile/_global/streams/out | 0 .../streams/test/compileIncremental/_global/streams/export | 0 .../streams/test/compileIncremental/_global/streams/out | 6 ------ .../test/copyResources/_global/streams/copy-resources | 1 - .../target/streams/test/copyResources/_global/streams/out | 2 -- scala/target/streams/test/definedTests/_global/streams/out | 2 -- .../test/dependencyClasspath/_global/streams/export | 1 - .../streams/test/exportedProducts/_global/streams/export | 1 - .../externalDependencyClasspath/_global/streams/export | 1 - .../streams/test/fullClasspath/_global/streams/export | 1 - scala/target/streams/test/incOptions/_global/streams/out | 2 -- .../internalDependencyClasspath/_global/streams/export | 1 - .../test/internalDependencyClasspath/_global/streams/out | 0 .../streams/test/loadedTestFrameworks/_global/streams/out | 7 ------- .../streams/test/managedClasspath/_global/streams/export | 1 - .../target/streams/test/scalacOptions/_global/streams/out | 0 scala/target/streams/test/test/_global/streams/out | 0 .../streams/test/unmanagedClasspath/_global/streams/export | 1 - .../streams/test/unmanagedClasspath/_global/streams/out | 0 .../streams/test/unmanagedJars/_global/streams/export | 1 - 64 files changed, 1 insertion(+), 65 deletions(-) delete mode 100644 scala/target/streams/_global/_global/_global/streams/out delete mode 100644 scala/target/streams/_global/_global/csrLogger/_global/streams/out delete mode 100644 scala/target/streams/_global/csrConfiguration/_global/streams/out delete mode 100644 scala/target/streams/_global/csrProject/_global/streams/out delete mode 100644 scala/target/streams/_global/dependencyPositions/_global/streams/update_cache_2.12/input_dsp delete mode 100644 scala/target/streams/_global/dependencyPositions/_global/streams/update_cache_2.12/output_dsp delete mode 100644 scala/target/streams/_global/ivyConfiguration/_global/streams/out delete mode 100644 scala/target/streams/_global/ivySbt/_global/streams/out delete mode 100644 scala/target/streams/_global/moduleSettings/_global/streams/out delete mode 100644 scala/target/streams/_global/projectDescriptors/_global/streams/out delete mode 100644 scala/target/streams/_global/scalaCompilerBridgeScope/_global/streams/out delete mode 100644 scala/target/streams/_global/testListeners/_global/streams/out delete mode 100644 scala/target/streams/_global/update/_global/streams/out delete mode 100644 scala/target/streams/compile/_global/_global/compileOutputs/previous delete mode 100644 scala/target/streams/compile/_global/_global/discoveredMainClasses/data delete mode 100644 scala/target/streams/compile/bspReporter/_global/streams/out delete mode 100644 scala/target/streams/compile/compile/_global/streams/out delete mode 100644 scala/target/streams/compile/compileIncremental/_global/streams/export delete mode 100644 scala/target/streams/compile/compileIncremental/_global/streams/out delete mode 100644 scala/target/streams/compile/copyResources/_global/streams/copy-resources delete mode 100644 scala/target/streams/compile/copyResources/_global/streams/out delete mode 100644 scala/target/streams/compile/dependencyClasspath/_global/streams/export delete mode 100644 scala/target/streams/compile/exportedProducts/_global/streams/export delete mode 100644 scala/target/streams/compile/externalDependencyClasspath/_global/streams/export delete mode 100644 scala/target/streams/compile/incOptions/_global/streams/out delete mode 100644 scala/target/streams/compile/internalDependencyClasspath/_global/streams/export delete mode 100644 scala/target/streams/compile/internalDependencyClasspath/_global/streams/out delete mode 100644 scala/target/streams/compile/mainClass/_global/streams/out delete mode 100644 scala/target/streams/compile/managedClasspath/_global/streams/export delete mode 100644 scala/target/streams/compile/packageBin/_global/streams/inputs delete mode 100644 scala/target/streams/compile/packageBin/_global/streams/out delete mode 100644 scala/target/streams/compile/packageBin/_global/streams/output delete mode 100644 scala/target/streams/compile/scalacOptions/_global/streams/out delete mode 100644 scala/target/streams/compile/unmanagedClasspath/_global/streams/export delete mode 100644 scala/target/streams/compile/unmanagedClasspath/_global/streams/out delete mode 100644 scala/target/streams/compile/unmanagedJars/_global/streams/export delete mode 100644 scala/target/streams/runtime/exportedProducts/_global/streams/export delete mode 100644 scala/target/streams/runtime/unmanagedJars/_global/streams/export delete mode 100644 scala/target/streams/test/_global/_global/compileOutputs/previous delete mode 100644 scala/target/streams/test/_global/_global/definedTestNames/data delete mode 100644 scala/target/streams/test/_global/_global/dependencyClasspathFiles/previous delete mode 100644 scala/target/streams/test/_global/_global/discoveredMainClasses/data delete mode 100644 scala/target/streams/test/bspReporter/_global/streams/out delete mode 100644 scala/target/streams/test/compile/_global/streams/out delete mode 100644 scala/target/streams/test/compileIncremental/_global/streams/export delete mode 100644 scala/target/streams/test/compileIncremental/_global/streams/out delete mode 100644 scala/target/streams/test/copyResources/_global/streams/copy-resources delete mode 100644 scala/target/streams/test/copyResources/_global/streams/out delete mode 100644 scala/target/streams/test/definedTests/_global/streams/out delete mode 100644 scala/target/streams/test/dependencyClasspath/_global/streams/export delete mode 100644 scala/target/streams/test/exportedProducts/_global/streams/export delete mode 100644 scala/target/streams/test/externalDependencyClasspath/_global/streams/export delete mode 100644 scala/target/streams/test/fullClasspath/_global/streams/export delete mode 100644 scala/target/streams/test/incOptions/_global/streams/out delete mode 100644 scala/target/streams/test/internalDependencyClasspath/_global/streams/export delete mode 100644 scala/target/streams/test/internalDependencyClasspath/_global/streams/out delete mode 100644 scala/target/streams/test/loadedTestFrameworks/_global/streams/out delete mode 100644 scala/target/streams/test/managedClasspath/_global/streams/export delete mode 100644 scala/target/streams/test/scalacOptions/_global/streams/out delete mode 100644 scala/target/streams/test/test/_global/streams/out delete mode 100644 scala/target/streams/test/unmanagedClasspath/_global/streams/export delete mode 100644 scala/target/streams/test/unmanagedClasspath/_global/streams/out delete mode 100644 scala/target/streams/test/unmanagedJars/_global/streams/export diff --git a/.gitignore b/.gitignore index cec6349f..005d0473 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,7 @@ coverage.xml scala/tempo/target scala/tempo/project/target/ scala/tempo/project/project/target/ +scala/target/stream/* # local delta tables **/spark-warehouse diff --git a/scala/target/streams/_global/_global/_global/streams/out b/scala/target/streams/_global/_global/_global/streams/out deleted file mode 100644 index e69de29b..00000000 diff --git a/scala/target/streams/_global/_global/csrLogger/_global/streams/out b/scala/target/streams/_global/_global/csrLogger/_global/streams/out deleted file mode 100644 index e69de29b..00000000 diff --git a/scala/target/streams/_global/csrConfiguration/_global/streams/out b/scala/target/streams/_global/csrConfiguration/_global/streams/out deleted file mode 100644 index e69de29b..00000000 diff --git a/scala/target/streams/_global/csrProject/_global/streams/out b/scala/target/streams/_global/csrProject/_global/streams/out deleted file mode 100644 index e69de29b..00000000 diff --git a/scala/target/streams/_global/dependencyPositions/_global/streams/update_cache_2.12/input_dsp b/scala/target/streams/_global/dependencyPositions/_global/streams/update_cache_2.12/input_dsp deleted file mode 100644 index 050fcc27..00000000 --- a/scala/target/streams/_global/dependencyPositions/_global/streams/update_cache_2.12/input_dsp +++ /dev/null @@ -1 +0,0 @@ --513150870 \ No newline at end of file diff --git a/scala/target/streams/_global/dependencyPositions/_global/streams/update_cache_2.12/output_dsp b/scala/target/streams/_global/dependencyPositions/_global/streams/update_cache_2.12/output_dsp deleted file mode 100644 index cd3ec45d..00000000 --- a/scala/target/streams/_global/dependencyPositions/_global/streams/update_cache_2.12/output_dsp +++ /dev/null @@ -1 +0,0 @@ -{"{\"organization\":\"org.scala-lang\",\"name\":\"scala-library\",\"revision\":\"2.12.12\",\"isChanging\":false,\"isTransitive\":true,\"isForce\":false,\"explicitArtifacts\":[],\"inclusions\":[],\"exclusions\":[],\"extraAttributes\":{},\"crossVersion\":{\"type\":\"Disabled\"}}":{"value":{"$fields":["path","startLine"],"path":"(sbt.Classpaths.jvmBaseSettings) Defaults.scala","startLine":3090},"type":"LinePosition"}} \ No newline at end of file diff --git a/scala/target/streams/_global/ivyConfiguration/_global/streams/out b/scala/target/streams/_global/ivyConfiguration/_global/streams/out deleted file mode 100644 index e69de29b..00000000 diff --git a/scala/target/streams/_global/ivySbt/_global/streams/out b/scala/target/streams/_global/ivySbt/_global/streams/out deleted file mode 100644 index e69de29b..00000000 diff --git a/scala/target/streams/_global/moduleSettings/_global/streams/out b/scala/target/streams/_global/moduleSettings/_global/streams/out deleted file mode 100644 index e69de29b..00000000 diff --git a/scala/target/streams/_global/projectDescriptors/_global/streams/out b/scala/target/streams/_global/projectDescriptors/_global/streams/out deleted file mode 100644 index e69de29b..00000000 diff --git a/scala/target/streams/_global/scalaCompilerBridgeScope/_global/streams/out b/scala/target/streams/_global/scalaCompilerBridgeScope/_global/streams/out deleted file mode 100644 index e69de29b..00000000 diff --git a/scala/target/streams/_global/testListeners/_global/streams/out b/scala/target/streams/_global/testListeners/_global/streams/out deleted file mode 100644 index e69de29b..00000000 diff --git a/scala/target/streams/_global/update/_global/streams/out b/scala/target/streams/_global/update/_global/streams/out deleted file mode 100644 index dad971a5..00000000 --- a/scala/target/streams/_global/update/_global/streams/out +++ /dev/null @@ -1,3 +0,0 @@ -[debug] not up to date. inChanged = true, force = false -[debug] Updating ... -[debug] Done updating diff --git a/scala/target/streams/compile/_global/_global/compileOutputs/previous b/scala/target/streams/compile/_global/_global/compileOutputs/previous deleted file mode 100644 index df061b4c..00000000 --- a/scala/target/streams/compile/_global/_global/compileOutputs/previous +++ /dev/null @@ -1 +0,0 @@ -["sbt.Task[scala.collection.Seq[java.nio.file.Path]]",["/Users/ricardo.portilla/Downloads/tempo/scala/target/scala-2.12/zinc/inc_compile_2.12.zip"]] \ No newline at end of file diff --git a/scala/target/streams/compile/_global/_global/discoveredMainClasses/data b/scala/target/streams/compile/_global/_global/discoveredMainClasses/data deleted file mode 100644 index 0637a088..00000000 --- a/scala/target/streams/compile/_global/_global/discoveredMainClasses/data +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/scala/target/streams/compile/bspReporter/_global/streams/out b/scala/target/streams/compile/bspReporter/_global/streams/out deleted file mode 100644 index e69de29b..00000000 diff --git a/scala/target/streams/compile/compile/_global/streams/out b/scala/target/streams/compile/compile/_global/streams/out deleted file mode 100644 index e69de29b..00000000 diff --git a/scala/target/streams/compile/compileIncremental/_global/streams/export b/scala/target/streams/compile/compileIncremental/_global/streams/export deleted file mode 100644 index e69de29b..00000000 diff --git a/scala/target/streams/compile/compileIncremental/_global/streams/out b/scala/target/streams/compile/compileIncremental/_global/streams/out deleted file mode 100644 index 5db86870..00000000 --- a/scala/target/streams/compile/compileIncremental/_global/streams/out +++ /dev/null @@ -1,6 +0,0 @@ -[debug] [zinc] IncrementalCompile ----------- -[debug] IncrementalCompile.incrementalCompile -[debug] previous = Stamps for: 0 products, 0 sources, 0 libraries -[debug] current source = Set() -[debug] > initialChanges = InitialChanges(Changes(added = Set(), removed = Set(), changed = Set(), unmodified = ...),Set(),Set(),API Changes: Set()) -[debug] Full compilation, no sources in previous analysis. diff --git a/scala/target/streams/compile/copyResources/_global/streams/copy-resources b/scala/target/streams/compile/copyResources/_global/streams/copy-resources deleted file mode 100644 index 9d348e7b..00000000 --- a/scala/target/streams/compile/copyResources/_global/streams/copy-resources +++ /dev/null @@ -1 +0,0 @@ -[[{},{}],{}] \ No newline at end of file diff --git a/scala/target/streams/compile/copyResources/_global/streams/out b/scala/target/streams/compile/copyResources/_global/streams/out deleted file mode 100644 index 49995276..00000000 --- a/scala/target/streams/compile/copyResources/_global/streams/out +++ /dev/null @@ -1,2 +0,0 @@ -[debug] Copy resource mappings: -[debug] diff --git a/scala/target/streams/compile/dependencyClasspath/_global/streams/export b/scala/target/streams/compile/dependencyClasspath/_global/streams/export deleted file mode 100644 index 106dbd32..00000000 --- a/scala/target/streams/compile/dependencyClasspath/_global/streams/export +++ /dev/null @@ -1 +0,0 @@ -/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/lib/scala-library.jar diff --git a/scala/target/streams/compile/exportedProducts/_global/streams/export b/scala/target/streams/compile/exportedProducts/_global/streams/export deleted file mode 100644 index eada49ea..00000000 --- a/scala/target/streams/compile/exportedProducts/_global/streams/export +++ /dev/null @@ -1 +0,0 @@ -/Users/ricardo.portilla/Downloads/tempo/scala/target/scala-2.12/classes diff --git a/scala/target/streams/compile/externalDependencyClasspath/_global/streams/export b/scala/target/streams/compile/externalDependencyClasspath/_global/streams/export deleted file mode 100644 index 106dbd32..00000000 --- a/scala/target/streams/compile/externalDependencyClasspath/_global/streams/export +++ /dev/null @@ -1 +0,0 @@ -/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/lib/scala-library.jar diff --git a/scala/target/streams/compile/incOptions/_global/streams/out b/scala/target/streams/compile/incOptions/_global/streams/out deleted file mode 100644 index 221af683..00000000 --- a/scala/target/streams/compile/incOptions/_global/streams/out +++ /dev/null @@ -1,2 +0,0 @@ -[debug] Created transactional ClassFileManager with tempDir = /Users/ricardo.portilla/Downloads/tempo/scala/target/scala-2.12/classes.bak -[debug] Removing the temporary directory used for backing up class files: /Users/ricardo.portilla/Downloads/tempo/scala/target/scala-2.12/classes.bak diff --git a/scala/target/streams/compile/internalDependencyClasspath/_global/streams/export b/scala/target/streams/compile/internalDependencyClasspath/_global/streams/export deleted file mode 100644 index 8b137891..00000000 --- a/scala/target/streams/compile/internalDependencyClasspath/_global/streams/export +++ /dev/null @@ -1 +0,0 @@ - diff --git a/scala/target/streams/compile/internalDependencyClasspath/_global/streams/out b/scala/target/streams/compile/internalDependencyClasspath/_global/streams/out deleted file mode 100644 index e69de29b..00000000 diff --git a/scala/target/streams/compile/mainClass/_global/streams/out b/scala/target/streams/compile/mainClass/_global/streams/out deleted file mode 100644 index e69de29b..00000000 diff --git a/scala/target/streams/compile/managedClasspath/_global/streams/export b/scala/target/streams/compile/managedClasspath/_global/streams/export deleted file mode 100644 index 106dbd32..00000000 --- a/scala/target/streams/compile/managedClasspath/_global/streams/export +++ /dev/null @@ -1 +0,0 @@ -/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/lib/scala-library.jar diff --git a/scala/target/streams/compile/packageBin/_global/streams/inputs b/scala/target/streams/compile/packageBin/_global/streams/inputs deleted file mode 100644 index 9332d732..00000000 --- a/scala/target/streams/compile/packageBin/_global/streams/inputs +++ /dev/null @@ -1 +0,0 @@ -340345967 \ No newline at end of file diff --git a/scala/target/streams/compile/packageBin/_global/streams/out b/scala/target/streams/compile/packageBin/_global/streams/out deleted file mode 100644 index 8b06fb90..00000000 --- a/scala/target/streams/compile/packageBin/_global/streams/out +++ /dev/null @@ -1,4 +0,0 @@ -[debug] Packaging /Users/ricardo.portilla/Downloads/tempo/scala/target/scala-2.12/scala_2.12-0.1.0-SNAPSHOT.jar ... -[debug] Input file mappings: -[debug] -[debug] Done packaging. diff --git a/scala/target/streams/compile/packageBin/_global/streams/output b/scala/target/streams/compile/packageBin/_global/streams/output deleted file mode 100644 index 870f468d..00000000 --- a/scala/target/streams/compile/packageBin/_global/streams/output +++ /dev/null @@ -1 +0,0 @@ --1094937831 \ No newline at end of file diff --git a/scala/target/streams/compile/scalacOptions/_global/streams/out b/scala/target/streams/compile/scalacOptions/_global/streams/out deleted file mode 100644 index e69de29b..00000000 diff --git a/scala/target/streams/compile/unmanagedClasspath/_global/streams/export b/scala/target/streams/compile/unmanagedClasspath/_global/streams/export deleted file mode 100644 index 8b137891..00000000 --- a/scala/target/streams/compile/unmanagedClasspath/_global/streams/export +++ /dev/null @@ -1 +0,0 @@ - diff --git a/scala/target/streams/compile/unmanagedClasspath/_global/streams/out b/scala/target/streams/compile/unmanagedClasspath/_global/streams/out deleted file mode 100644 index e69de29b..00000000 diff --git a/scala/target/streams/compile/unmanagedJars/_global/streams/export b/scala/target/streams/compile/unmanagedJars/_global/streams/export deleted file mode 100644 index 8b137891..00000000 --- a/scala/target/streams/compile/unmanagedJars/_global/streams/export +++ /dev/null @@ -1 +0,0 @@ - diff --git a/scala/target/streams/runtime/exportedProducts/_global/streams/export b/scala/target/streams/runtime/exportedProducts/_global/streams/export deleted file mode 100644 index eada49ea..00000000 --- a/scala/target/streams/runtime/exportedProducts/_global/streams/export +++ /dev/null @@ -1 +0,0 @@ -/Users/ricardo.portilla/Downloads/tempo/scala/target/scala-2.12/classes diff --git a/scala/target/streams/runtime/unmanagedJars/_global/streams/export b/scala/target/streams/runtime/unmanagedJars/_global/streams/export deleted file mode 100644 index 8b137891..00000000 --- a/scala/target/streams/runtime/unmanagedJars/_global/streams/export +++ /dev/null @@ -1 +0,0 @@ - diff --git a/scala/target/streams/test/_global/_global/compileOutputs/previous b/scala/target/streams/test/_global/_global/compileOutputs/previous deleted file mode 100644 index cea65a93..00000000 --- a/scala/target/streams/test/_global/_global/compileOutputs/previous +++ /dev/null @@ -1 +0,0 @@ -["sbt.Task[scala.collection.Seq[java.nio.file.Path]]",["/Users/ricardo.portilla/Downloads/tempo/scala/target/scala-2.12/test-zinc/inc_compile_2.12.zip"]] \ No newline at end of file diff --git a/scala/target/streams/test/_global/_global/definedTestNames/data b/scala/target/streams/test/_global/_global/definedTestNames/data deleted file mode 100644 index 0637a088..00000000 --- a/scala/target/streams/test/_global/_global/definedTestNames/data +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/scala/target/streams/test/_global/_global/dependencyClasspathFiles/previous b/scala/target/streams/test/_global/_global/dependencyClasspathFiles/previous deleted file mode 100644 index 8a75ec53..00000000 --- a/scala/target/streams/test/_global/_global/dependencyClasspathFiles/previous +++ /dev/null @@ -1 +0,0 @@ -["sbt.Task[scala.collection.Seq[java.nio.file.Path]]",["/Users/ricardo.portilla/Downloads/tempo/scala/target/scala-2.12/classes","/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/lib/scala-library.jar"]] \ No newline at end of file diff --git a/scala/target/streams/test/_global/_global/discoveredMainClasses/data b/scala/target/streams/test/_global/_global/discoveredMainClasses/data deleted file mode 100644 index 0637a088..00000000 --- a/scala/target/streams/test/_global/_global/discoveredMainClasses/data +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/scala/target/streams/test/bspReporter/_global/streams/out b/scala/target/streams/test/bspReporter/_global/streams/out deleted file mode 100644 index e69de29b..00000000 diff --git a/scala/target/streams/test/compile/_global/streams/out b/scala/target/streams/test/compile/_global/streams/out deleted file mode 100644 index e69de29b..00000000 diff --git a/scala/target/streams/test/compileIncremental/_global/streams/export b/scala/target/streams/test/compileIncremental/_global/streams/export deleted file mode 100644 index e69de29b..00000000 diff --git a/scala/target/streams/test/compileIncremental/_global/streams/out b/scala/target/streams/test/compileIncremental/_global/streams/out deleted file mode 100644 index 5db86870..00000000 --- a/scala/target/streams/test/compileIncremental/_global/streams/out +++ /dev/null @@ -1,6 +0,0 @@ -[debug] [zinc] IncrementalCompile ----------- -[debug] IncrementalCompile.incrementalCompile -[debug] previous = Stamps for: 0 products, 0 sources, 0 libraries -[debug] current source = Set() -[debug] > initialChanges = InitialChanges(Changes(added = Set(), removed = Set(), changed = Set(), unmodified = ...),Set(),Set(),API Changes: Set()) -[debug] Full compilation, no sources in previous analysis. diff --git a/scala/target/streams/test/copyResources/_global/streams/copy-resources b/scala/target/streams/test/copyResources/_global/streams/copy-resources deleted file mode 100644 index 9d348e7b..00000000 --- a/scala/target/streams/test/copyResources/_global/streams/copy-resources +++ /dev/null @@ -1 +0,0 @@ -[[{},{}],{}] \ No newline at end of file diff --git a/scala/target/streams/test/copyResources/_global/streams/out b/scala/target/streams/test/copyResources/_global/streams/out deleted file mode 100644 index 49995276..00000000 --- a/scala/target/streams/test/copyResources/_global/streams/out +++ /dev/null @@ -1,2 +0,0 @@ -[debug] Copy resource mappings: -[debug] diff --git a/scala/target/streams/test/definedTests/_global/streams/out b/scala/target/streams/test/definedTests/_global/streams/out deleted file mode 100644 index bf899f07..00000000 --- a/scala/target/streams/test/definedTests/_global/streams/out +++ /dev/null @@ -1,2 +0,0 @@ -[debug] Subclass fingerprints: List() -[debug] Annotation fingerprints: List() diff --git a/scala/target/streams/test/dependencyClasspath/_global/streams/export b/scala/target/streams/test/dependencyClasspath/_global/streams/export deleted file mode 100644 index 20db1a57..00000000 --- a/scala/target/streams/test/dependencyClasspath/_global/streams/export +++ /dev/null @@ -1 +0,0 @@ -/Users/ricardo.portilla/Downloads/tempo/scala/target/scala-2.12/classes:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/lib/scala-library.jar diff --git a/scala/target/streams/test/exportedProducts/_global/streams/export b/scala/target/streams/test/exportedProducts/_global/streams/export deleted file mode 100644 index b0e5348a..00000000 --- a/scala/target/streams/test/exportedProducts/_global/streams/export +++ /dev/null @@ -1 +0,0 @@ -/Users/ricardo.portilla/Downloads/tempo/scala/target/scala-2.12/test-classes diff --git a/scala/target/streams/test/externalDependencyClasspath/_global/streams/export b/scala/target/streams/test/externalDependencyClasspath/_global/streams/export deleted file mode 100644 index 106dbd32..00000000 --- a/scala/target/streams/test/externalDependencyClasspath/_global/streams/export +++ /dev/null @@ -1 +0,0 @@ -/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/lib/scala-library.jar diff --git a/scala/target/streams/test/fullClasspath/_global/streams/export b/scala/target/streams/test/fullClasspath/_global/streams/export deleted file mode 100644 index 938b07cf..00000000 --- a/scala/target/streams/test/fullClasspath/_global/streams/export +++ /dev/null @@ -1 +0,0 @@ -/Users/ricardo.portilla/Downloads/tempo/scala/target/scala-2.12/test-classes:/Users/ricardo.portilla/Downloads/tempo/scala/target/scala-2.12/classes:/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/lib/scala-library.jar diff --git a/scala/target/streams/test/incOptions/_global/streams/out b/scala/target/streams/test/incOptions/_global/streams/out deleted file mode 100644 index eab37cca..00000000 --- a/scala/target/streams/test/incOptions/_global/streams/out +++ /dev/null @@ -1,2 +0,0 @@ -[debug] Created transactional ClassFileManager with tempDir = /Users/ricardo.portilla/Downloads/tempo/scala/target/scala-2.12/test-classes.bak -[debug] Removing the temporary directory used for backing up class files: /Users/ricardo.portilla/Downloads/tempo/scala/target/scala-2.12/test-classes.bak diff --git a/scala/target/streams/test/internalDependencyClasspath/_global/streams/export b/scala/target/streams/test/internalDependencyClasspath/_global/streams/export deleted file mode 100644 index eada49ea..00000000 --- a/scala/target/streams/test/internalDependencyClasspath/_global/streams/export +++ /dev/null @@ -1 +0,0 @@ -/Users/ricardo.portilla/Downloads/tempo/scala/target/scala-2.12/classes diff --git a/scala/target/streams/test/internalDependencyClasspath/_global/streams/out b/scala/target/streams/test/internalDependencyClasspath/_global/streams/out deleted file mode 100644 index e69de29b..00000000 diff --git a/scala/target/streams/test/loadedTestFrameworks/_global/streams/out b/scala/target/streams/test/loadedTestFrameworks/_global/streams/out deleted file mode 100644 index 16f17d6e..00000000 --- a/scala/target/streams/test/loadedTestFrameworks/_global/streams/out +++ /dev/null @@ -1,7 +0,0 @@ -[debug] Framework implementation 'org.scalacheck.ScalaCheckFramework' not present. -[debug] Framework implementation 'org.specs2.runner.Specs2Framework' not present. -[debug] Framework implementation 'org.specs2.runner.SpecsFramework' not present. -[debug] Framework implementation 'org.specs.runner.SpecsFramework' not present. -[debug] Framework implementation 'org.scalatest.tools.Framework' not present. -[debug] Framework implementation 'org.scalatest.tools.ScalaTestFramework' not present. -[debug] Framework implementation 'com.novocode.junit.JUnitFramework' not present. diff --git a/scala/target/streams/test/managedClasspath/_global/streams/export b/scala/target/streams/test/managedClasspath/_global/streams/export deleted file mode 100644 index 106dbd32..00000000 --- a/scala/target/streams/test/managedClasspath/_global/streams/export +++ /dev/null @@ -1 +0,0 @@ -/Users/ricardo.portilla/.sbt/boot/scala-2.12.12/lib/scala-library.jar diff --git a/scala/target/streams/test/scalacOptions/_global/streams/out b/scala/target/streams/test/scalacOptions/_global/streams/out deleted file mode 100644 index e69de29b..00000000 diff --git a/scala/target/streams/test/test/_global/streams/out b/scala/target/streams/test/test/_global/streams/out deleted file mode 100644 index e69de29b..00000000 diff --git a/scala/target/streams/test/unmanagedClasspath/_global/streams/export b/scala/target/streams/test/unmanagedClasspath/_global/streams/export deleted file mode 100644 index 8b137891..00000000 --- a/scala/target/streams/test/unmanagedClasspath/_global/streams/export +++ /dev/null @@ -1 +0,0 @@ - diff --git a/scala/target/streams/test/unmanagedClasspath/_global/streams/out b/scala/target/streams/test/unmanagedClasspath/_global/streams/out deleted file mode 100644 index e69de29b..00000000 diff --git a/scala/target/streams/test/unmanagedJars/_global/streams/export b/scala/target/streams/test/unmanagedJars/_global/streams/export deleted file mode 100644 index 8b137891..00000000 --- a/scala/target/streams/test/unmanagedJars/_global/streams/export +++ /dev/null @@ -1 +0,0 @@ - From 32f5fc30ce3e6578f9d6da4fc86d0e0bd26d4323 Mon Sep 17 00:00:00 2001 From: Ricardo Portilla Date: Sun, 15 Aug 2021 21:17:03 -0400 Subject: [PATCH 09/39] removing streams --- python/tempo/ad.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/python/tempo/ad.py b/python/tempo/ad.py index e60690d2..1fa205d7 100644 --- a/python/tempo/ad.py +++ b/python/tempo/ad.py @@ -38,6 +38,7 @@ def calc_anomalies(spark, yaml_file): print(d) print(data[d]) table = data[d]['database'] + '.' + data[d]['name'] + tgt_table = 'tempo.' + data[d]['name'] df = spark.table(table) partition_cols = data[d]['partition_cols'] ts_col = data[d]['ts_col'] @@ -67,12 +68,13 @@ def calc_anomalies(spark, yaml_file): tsdf = TSDF(stacked, partition_cols = part_cols_w_metrics, ts_col = ts_col) moving_avg = tsdf.withRangeStats(['value'], rangeBackWindowSecs=int(lkbck_window)).df - anomalies = moving_avg.select(ts_col, *partition_cols, 'zscore_' + 'value').withColumn("anomaly_fl", F.when(F.col('zscore_' + 'value') > 2.5, 1).otherwise(0)) + anomalies = moving_avg.select(ts_col, *partition_cols, 'metric', 'zscore_' + 'value').withColumn("anomaly_fl", F.when(F.col('zscore_' + 'value') > 2.5, 1).otherwise(0)) # class 1 - 2.5 standard deviations outside mean # brand new table if mode == 'new': - anomalies.write.mode('overwrite').format("delta").saveAsTable(table + "_class1") + spark.sql("create database if not exists tempo") + anomalies.write.mode('overwrite').option("overwriteSchema", "true").format("delta").saveAsTable(tgt_table + "_class1") # append to existing table without DLT elif mode == 'append': # incremental append with DLT From ef90f31e5db14d7296e39359063bc43eb03b766e Mon Sep 17 00:00:00 2001 From: Ricardo Portilla Date: Wed, 8 Sep 2021 10:57:26 -0400 Subject: [PATCH 10/39] adding anomaly detection yaml support --- python/README.md | 30 ++++++++++++++++++++++++++++++ python/tests/tests.py | 2 -- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/python/README.md b/python/README.md index e5e0cd4f..ebbdbbcb 100644 --- a/python/README.md +++ b/python/README.md @@ -142,7 +142,37 @@ moving_avg = watch_accel_tsdf.withRangeStats("y", rangeBackWindowSecs=600).df moving_avg.select('event_ts', 'x', 'y', 'z', 'mean_y').show(10, False) ``` +#### 6 - Anomaly Detection +First create a local yaml file containing tables you wish to create anomalies for: + +Note: Use `%sh` in Databricks or just run a bash command in your local directory as follows: + +``` +echo """ +table1: +database : "default" +name : "revenue_hourly_2021" +ts_col : "timestamp" +lookback_window : "84600" +mode : "new" +# include any grouping columns or metrics you wish to detect anomalies on +partition_cols : ["winner"] +metrics : ["advertiser_impressions", "publisher_net_revenue"] +""" > ad.yaml +``` + +The code to run to produce the stacked table with anomalies is: + +``` +from tempo.tsdf import TSDF +from tempo.ad import * + +calc_anomalies(spark, 'ad.yaml') +``` +The above yaml and code defines an output table with suffix ```_class1``. Select the results from your table in the metastore using this `SELECT` statement: + +select * from tempo.revenue_hourly_2021_class1 ## Project Support Please note that all projects in the /databrickslabs github account are provided for your exploration only, and are not formally supported by Databricks with Service Level Agreements (SLAs). They are provided AS-IS and we do not make any guarantees of any kind. Please do not submit a support ticket relating to any issues arising from the use of these projects. diff --git a/python/tests/tests.py b/python/tests/tests.py index 5e477de8..406f190e 100644 --- a/python/tests/tests.py +++ b/python/tests/tests.py @@ -522,9 +522,7 @@ def test_upsample(self): # convert to TSDF tsdf_left = TSDF(df, partition_cols=["symbol"]) - resample_30m = tsdf_left.resample(freq = "5 minutes", func = "mean", fill = True).df.withColumn("trade_pr", F.round(F.col('trade_pr'), 2)) - bars = tsdf_left.calc_bars(freq='min', metricCols = ['trade_pr', 'trade_pr_2']).df upsampled = resample_30m.filter(F.col("event_ts").isin('2020-08-01 00:00:00', '2020-08-01 00:05:00', '2020-09-01 00:00:00', '2020-09-01 00:15:00')) From c671764ed1cddda971c1ddfa732214fa90159b52 Mon Sep 17 00:00:00 2001 From: Ricardo Portilla Date: Fri, 10 Sep 2021 10:05:06 -0400 Subject: [PATCH 11/39] making database configurable --- python/tempo/ad.py | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/python/tempo/ad.py b/python/tempo/ad.py index 1fa205d7..f9422339 100644 --- a/python/tempo/ad.py +++ b/python/tempo/ad.py @@ -25,27 +25,21 @@ def calc_anomalies(spark, yaml_file): else: yaml_path = yaml_file - print(yaml_path) - with open(yaml_path) as f: data = yaml.load(f, Loader=yaml.FullLoader) - print(data) - print('data type is ' + str(type(data))) import json for d in data.keys(): - print(d) - print(data[d]) + database = data[d]['database'] table = data[d]['database'] + '.' + data[d]['name'] - tgt_table = 'tempo.' + data[d]['name'] + tgt_table = database + data[d]['name'] df = spark.table(table) partition_cols = data[d]['partition_cols'] ts_col = data[d]['ts_col'] mode = data[d]['mode'] metrics = data[d]['metrics'] lkbck_window = data[d]['lookback_window'] - #tsdf = TSDF(df, partition_cols = partition_cols, ts_col = ts_col) # logic to stack metrics instead of individual columns l = [] @@ -73,7 +67,7 @@ def calc_anomalies(spark, yaml_file): # class 1 - 2.5 standard deviations outside mean # brand new table if mode == 'new': - spark.sql("create database if not exists tempo") + spark.sql("create database if not exists {}".format(database)) anomalies.write.mode('overwrite').option("overwriteSchema", "true").format("delta").saveAsTable(tgt_table + "_class1") # append to existing table without DLT elif mode == 'append': From 7e5fd1b7b1a051f31104cefe4d21f86d759f111a Mon Sep 17 00:00:00 2001 From: Ricardo Portilla Date: Fri, 10 Sep 2021 10:31:16 -0400 Subject: [PATCH 12/39] making database configurable --- python/tempo/ad.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/tempo/ad.py b/python/tempo/ad.py index f9422339..a12e947d 100644 --- a/python/tempo/ad.py +++ b/python/tempo/ad.py @@ -62,7 +62,7 @@ def calc_anomalies(spark, yaml_file): tsdf = TSDF(stacked, partition_cols = part_cols_w_metrics, ts_col = ts_col) moving_avg = tsdf.withRangeStats(['value'], rangeBackWindowSecs=int(lkbck_window)).df - anomalies = moving_avg.select(ts_col, *partition_cols, 'metric', 'zscore_' + 'value').withColumn("anomaly_fl", F.when(F.col('zscore_' + 'value') > 2.5, 1).otherwise(0)) + anomalies = moving_avg.select(ts_col, *partition_cols, 'metric', 'value', 'zscore_' + 'value').withColumn("anomaly_fl", F.when(F.col('zscore_' + 'value') > 2.5, 1).otherwise(0)) # class 1 - 2.5 standard deviations outside mean # brand new table From cd853b7dcfba699bd0bab9026a6fe7d2e7fb3b9d Mon Sep 17 00:00:00 2001 From: Ricardo Portilla Date: Fri, 10 Sep 2021 11:24:13 -0400 Subject: [PATCH 13/39] making database configurable --- python/tempo/ad.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/tempo/ad.py b/python/tempo/ad.py index a12e947d..37f814e9 100644 --- a/python/tempo/ad.py +++ b/python/tempo/ad.py @@ -33,7 +33,7 @@ def calc_anomalies(spark, yaml_file): for d in data.keys(): database = data[d]['database'] table = data[d]['database'] + '.' + data[d]['name'] - tgt_table = database + data[d]['name'] + tgt_table = database + '.' + data[d]['name'] df = spark.table(table) partition_cols = data[d]['partition_cols'] ts_col = data[d]['ts_col'] From 2c2ed637b915ceb5ac09c637a2589b5eff722eb5 Mon Sep 17 00:00:00 2001 From: Ricardo Portilla Date: Sat, 11 Sep 2021 10:46:34 -0400 Subject: [PATCH 14/39] added option for empty string prefix --- python/tempo/tsdf.py | 10 +++++++--- python/tests/tests.py | 8 ++++++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/python/tempo/tsdf.py b/python/tempo/tsdf.py index 2215fd55..3db67021 100644 --- a/python/tempo/tsdf.py +++ b/python/tempo/tsdf.py @@ -63,11 +63,11 @@ def __addPrefixToColumns(self,col_list,prefix): """ from functools import reduce - df = reduce(lambda df, idx: df.withColumnRenamed(col_list[idx], '_'.join([prefix,col_list[idx]])), + df = reduce(lambda df, idx: df.withColumnRenamed(col_list[idx], ''.join([prefix,col_list[idx]])), range(len(col_list)), self.df) - ts_col = '_'.join([prefix, self.ts_col]) - seq_col = '_'.join([prefix, self.sequence_col]) if self.sequence_col else self.sequence_col + ts_col = ''.join([prefix, self.ts_col]) + seq_col = ''.join([prefix, self.sequence_col]) if self.sequence_col else self.sequence_col return TSDF(df, ts_col, self.partitionCols, sequence_col = seq_col) def __addColumnsFromOtherDF(self, other_cols): @@ -225,6 +225,10 @@ def asofJoin(self, right_tsdf, left_prefix=None, right_prefix="right", tsPartiti left_df = self.df right_df = right_tsdf.df + if left_prefix: + left_prefix = left_prefix + '_' + if right_prefix: + right_prefix = right_prefix + '_' # validate timestamp datatypes match self.__validateTsColMatch(right_tsdf) diff --git a/python/tests/tests.py b/python/tests/tests.py index f8493164..4dbbbc1c 100644 --- a/python/tests/tests.py +++ b/python/tests/tests.py @@ -216,6 +216,12 @@ def test_asof_join(self): StructField("right_event_ts", StringType()), StructField("right_bid_pr", FloatType()), StructField("right_ask_pr", FloatType())]) + expectedSchemaNoRightPrefix = StructType([StructField("symbol", StringType()), + StructField("left_event_ts", StringType()), + StructField("left_trade_pr", FloatType()), + StructField("event_ts", StringType()), + StructField("bid_pr", FloatType()), + StructField("ask_pr", FloatType())]) left_data = [["S1", "2020-08-01 00:00:10", 349.21], ["S1", "2020-08-01 00:01:12", 351.32], @@ -243,9 +249,11 @@ def test_asof_join(self): tsdf_right = TSDF(dfRight, ts_col="event_ts", partition_cols=["symbol"]) joined_df = tsdf_left.asofJoin(tsdf_right, left_prefix="left", right_prefix="right").df + non_prefix_joined_df = tsdf_left.asofJoin(tsdf_right, left_prefix="left", right_prefix = '').df # joined dataframe should equal the expected dataframe self.assertDataFramesEqual(joined_df, dfExpected) + self.assertDataFramesEqual(non_prefix_joined_df, expectedSchemaNoRightPrefix) def test_sequence_number_sort(self): """Skew AS-OF Join with Partition Window Test""" From b49ef5fab44fd0fd3894ee255c7c5532e22535d4 Mon Sep 17 00:00:00 2001 From: Ricardo Portilla Date: Sun, 12 Sep 2021 01:11:51 -0400 Subject: [PATCH 15/39] added option for empty string prefix --- python/tempo/tsdf.py | 30 +++++++++++++++++++++++++++++- python/tests/tests.py | 4 +++- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/python/tempo/tsdf.py b/python/tempo/tsdf.py index 3db67021..e4819434 100644 --- a/python/tempo/tsdf.py +++ b/python/tempo/tsdf.py @@ -3,6 +3,9 @@ import tempo.resample as rs import tempo.io as tio +from pyspark.sql import SparkSession + + class TSDF: def __init__(self, df, ts_col="event_ts", partition_cols=None, sequence_col = None): @@ -201,7 +204,7 @@ def describe(self): return(full_smry) pass - def asofJoin(self, right_tsdf, left_prefix=None, right_prefix="right", tsPartitionVal=None, fraction=0.5): + def asofJoin(self, right_tsdf, left_prefix=None, right_prefix="right", tsPartitionVal=None, fraction=0.5, override_legacy=False): """ Performs an as-of join between two time-series. If a tsPartitionVal is specified, it will do this partitioned by time brackets, which can help alleviate skew. @@ -215,6 +218,31 @@ def asofJoin(self, right_tsdf, left_prefix=None, right_prefix="right", tsPartiti :param fraction - overlap fraction """ + # first block of logic checks whether a standard range join will suffice + left_df = self.df + right_df = right_tsdf.df + + spark = (SparkSession.builder.appName("myapp").getOrCreate()) + + left_plan = left_df._jdf.queryExecution().logical() + left_bytes = spark._jsparkSession.sessionState().executePlan(left_plan).optimizedPlan().stats().sizeInBytes() + right_plan = right_df._jdf.queryExecution().logical() + right_bytes = spark._jsparkSession.sessionState().executePlan(right_plan).optimizedPlan().stats().sizeInBytes() + + # choose 30MB as the cutoff for the broadcast + bytes_threshold = 30*1024*1024 + if (left_bytes < bytes_threshold) | (right_bytes < bytes_threshold) | override_legacy: + #print("in standard spark sql join") + spark.conf.set("spark.databricks.optimizer.rangeJoin.binSize", 60) + partition_cols = right_tsdf.partitionCols + w = Window.partitionBy(*partition_cols).orderBy(right_tsdf.ts_col) + quotes_cols = list(set(right_df.columns).difference(set(right_tsdf.partitionCols + [right_tsdf.ts_col]))) + part_cols_plus_ts = partition_cols + [right_tsdf.ts_col] + quotes_df_w_lag = left_df.withColumn("lead_" + right_tsdf.ts_col, f.lead(right_tsdf.ts_col).over(w)).withColumnRenamed(right_tsdf.ts_col, 'right_' + right_tsdf.ts_col) + quotes_df_w_lag_tsdf = TSDF(quotes_df_w_lag, partition_cols=right_tsdf.partitionCols, ts_col='right_' + right_tsdf.ts_col) + res = left_df.join(quotes_df_w_lag, partition_cols).where(left_df[self.ts_col].between(f.col('right_' + right_tsdf.ts_col), f.col('lead_' + right_tsdf.ts_col))).drop('right_' + right_tsdf.ts_col) + return(TSDF(res, partition_cols=self.partitionCols, ts_col=self.ts_col)) + if (tsPartitionVal is not None): print("WARNING: You are using the skew version of the AS OF join. This may result in null values if there are any values outside of the maximum lookback. For maximum efficiency, choose smaller values of maximum lookback, trading off performance and potential blank AS OF values for sparse keys") diff --git a/python/tests/tests.py b/python/tests/tests.py index 4dbbbc1c..9b2b8c36 100644 --- a/python/tests/tests.py +++ b/python/tests/tests.py @@ -253,7 +253,9 @@ def test_asof_join(self): # joined dataframe should equal the expected dataframe self.assertDataFramesEqual(joined_df, dfExpected) - self.assertDataFramesEqual(non_prefix_joined_df, expectedSchemaNoRightPrefix) + + noRightPrefixdfExpected = self.buildTestDF(expectedSchemaNoRightPrefix, expected_data, ["left_event_ts", "event_ts"]) + self.assertDataFramesEqual(non_prefix_joined_df, noRightPrefixdfExpected) def test_sequence_number_sort(self): """Skew AS-OF Join with Partition Window Test""" From d2f5a34f4e8dbc96d50402f3d6a518bc8ea44a69 Mon Sep 17 00:00:00 2001 From: Ricardo Portilla Date: Sun, 12 Sep 2021 17:49:37 -0400 Subject: [PATCH 16/39] added option for empty string prefix --- python/tempo/tsdf.py | 20 +++++++++++++------- python/tests/tests.py | 3 +++ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/python/tempo/tsdf.py b/python/tempo/tsdf.py index e4819434..84105ea8 100644 --- a/python/tempo/tsdf.py +++ b/python/tempo/tsdf.py @@ -232,16 +232,22 @@ def asofJoin(self, right_tsdf, left_prefix=None, right_prefix="right", tsPartiti # choose 30MB as the cutoff for the broadcast bytes_threshold = 30*1024*1024 if (left_bytes < bytes_threshold) | (right_bytes < bytes_threshold) | override_legacy: - #print("in standard spark sql join") spark.conf.set("spark.databricks.optimizer.rangeJoin.binSize", 60) partition_cols = right_tsdf.partitionCols - w = Window.partitionBy(*partition_cols).orderBy(right_tsdf.ts_col) - quotes_cols = list(set(right_df.columns).difference(set(right_tsdf.partitionCols + [right_tsdf.ts_col]))) - part_cols_plus_ts = partition_cols + [right_tsdf.ts_col] - quotes_df_w_lag = left_df.withColumn("lead_" + right_tsdf.ts_col, f.lead(right_tsdf.ts_col).over(w)).withColumnRenamed(right_tsdf.ts_col, 'right_' + right_tsdf.ts_col) + w = Window.partitionBy(*partition_cols).orderBy(right_prefix + '_' + right_tsdf.ts_col) + left_cols = list(set(left_df.columns).difference(set(self.partitionCols))) + right_cols = list(set(right_df.columns).difference(set(right_tsdf.partitionCols))) + new_left_cols = left_cols + if left_prefix: + new_left_ts_col = left_prefix + '_' + self.ts_col + new_left_cols = [f.col(c).alias(left_prefix + '_' + c) for c in left_cols] + partition_cols + new_right_cols = [f.col(c).alias(right_prefix + '_' + c) for c in right_cols] + partition_cols + quotes_df_w_lag = right_df.select(*new_right_cols).withColumn("lead_" + right_tsdf.ts_col, f.lead(right_prefix + '_' + right_tsdf.ts_col).over(w))#.withColumnRenamed(right_tsdf.ts_col, 'right_' + right_tsdf.ts_col) quotes_df_w_lag_tsdf = TSDF(quotes_df_w_lag, partition_cols=right_tsdf.partitionCols, ts_col='right_' + right_tsdf.ts_col) - res = left_df.join(quotes_df_w_lag, partition_cols).where(left_df[self.ts_col].between(f.col('right_' + right_tsdf.ts_col), f.col('lead_' + right_tsdf.ts_col))).drop('right_' + right_tsdf.ts_col) - return(TSDF(res, partition_cols=self.partitionCols, ts_col=self.ts_col)) + left_df = left_df.select(*new_left_cols) + res = left_df.join(quotes_df_w_lag, partition_cols).where(left_df[new_left_ts_col].between(f.col('right_' + right_tsdf.ts_col), f.coalesce(f.col('lead_' + right_tsdf.ts_col), f.lit('2099-01-01').cast("timestamp")))).drop('lead_' + right_tsdf.ts_col) + return(TSDF(res, partition_cols=self.partitionCols, ts_col=new_left_ts_col)) + # end of block checking to see if standard Spark SQL join will work if (tsPartitionVal is not None): print("WARNING: You are using the skew version of the AS OF join. This may result in null values if there are any values outside of the maximum lookback. For maximum efficiency, choose smaller values of maximum lookback, trading off performance and potential blank AS OF values for sparse keys") diff --git a/python/tests/tests.py b/python/tests/tests.py index 9b2b8c36..5a32b916 100644 --- a/python/tests/tests.py +++ b/python/tests/tests.py @@ -257,6 +257,9 @@ def test_asof_join(self): noRightPrefixdfExpected = self.buildTestDF(expectedSchemaNoRightPrefix, expected_data, ["left_event_ts", "event_ts"]) self.assertDataFramesEqual(non_prefix_joined_df, noRightPrefixdfExpected) + spark_sql_joined_df = tsdf_left.asofJoin(tsdf_right, left_prefix="left", right_prefix="right", override_legacy=True).df + self.assertDataFramesEqual(spark_sql_joined_df, dfExpected) + def test_sequence_number_sort(self): """Skew AS-OF Join with Partition Window Test""" leftSchema = StructType([StructField("symbol", StringType()), From d7de342be5ead79220c29a16efdb8452489382d8 Mon Sep 17 00:00:00 2001 From: Ricardo Portilla Date: Sun, 12 Sep 2021 17:52:48 -0400 Subject: [PATCH 17/39] removing anomaly detection in branch --- python/tempo/ad.py | 92 ------------------------------------------- python/tests/tests.py | 45 --------------------- 2 files changed, 137 deletions(-) delete mode 100644 python/tempo/ad.py diff --git a/python/tempo/ad.py b/python/tempo/ad.py deleted file mode 100644 index 37f814e9..00000000 --- a/python/tempo/ad.py +++ /dev/null @@ -1,92 +0,0 @@ -from tempo.tsdf import TSDF -import pyspark.sql.functions as F - -def calc_anomalies(spark, yaml_file): - - import os - import yaml - - yaml_path = '' - - if (yaml_file.startswith("s3")): - import boto3 - - s3 = boto3.client('s3') - s3_bucket = yaml_file.split("s3://")[1] - bucket_file_tuple = s3_bucket.split("/") - bucket_name_only = bucket_file_tuple[0] - file_only = "/".join(bucket_file_tuple[1:]) - - s3.download_file(bucket_name_only, file_only, 'ad.yaml') - yaml_path = '/databricks/driver/ad.yaml' - elif yaml_file.startswith("dbfs:/") & (os.getenv('DATABRICKS_RUNTIME_VERSION') != None): - new_dbfs_path = "/" + yaml_file.replace(":", "") - yaml_path = new_dbfs_path - else: - yaml_path = yaml_file - - with open(yaml_path) as f: - - data = yaml.load(f, Loader=yaml.FullLoader) - - import json - for d in data.keys(): - database = data[d]['database'] - table = data[d]['database'] + '.' + data[d]['name'] - tgt_table = database + '.' + data[d]['name'] - df = spark.table(table) - partition_cols = data[d]['partition_cols'] - ts_col = data[d]['ts_col'] - mode = data[d]['mode'] - metrics = data[d]['metrics'] - lkbck_window = data[d]['lookback_window'] - - # logic to stack metrics instead of individual columns - l = [] - sep = ', ' - sql_list = sep.join(metrics).split(",") - n = len(metrics) - for a in range(n): - l.append("'{}'".format(metrics[a]) + "," + sql_list[a]) - # partition_col string - partition_cols_str = ", ".join(partition_cols) - metrics_cols_str = ", ".join(metrics) - k = sep.join(l) - for metric_col in metrics: - df = df.withColumn(metric_col, F.col(metric_col).cast("double")) - - df.createOrReplaceTempView("tsdf_view") - stacked = spark.sql("select {}, {}, {}, stack({}, {}) as (metric, value) from tsdf_view".format(ts_col, partition_cols_str, metrics_cols_str, n, k)) - - part_cols_w_metrics = partition_cols + metrics - - tsdf = TSDF(stacked, partition_cols = part_cols_w_metrics, ts_col = ts_col) - moving_avg = tsdf.withRangeStats(['value'], rangeBackWindowSecs=int(lkbck_window)).df - anomalies = moving_avg.select(ts_col, *partition_cols, 'metric', 'value', 'zscore_' + 'value').withColumn("anomaly_fl", F.when(F.col('zscore_' + 'value') > 2.5, 1).otherwise(0)) - - # class 1 - 2.5 standard deviations outside mean - # brand new table - if mode == 'new': - spark.sql("create database if not exists {}".format(database)) - anomalies.write.mode('overwrite').option("overwriteSchema", "true").format("delta").saveAsTable(tgt_table + "_class1") - # append to existing table without DLT - elif mode == 'append': - # incremental append with DLT - print('hey') - elif (mode == 'incremental') & (os.getenv('DATABRICKS_RUNTIME_VERSION') != None): - import dlt - @dlt.view - def taxi_raw(): - return spark.read.json("/databricks-datasets/nyctaxi/sample/json/") - - # Use the function name as the table name - @dlt.table - def filtered_data(): - return dlt.read("taxi_raw").where(...) - - # Use the name parameter as the table name - @dlt.table(name="filtered_data") - def create_filtered_data(): - return dlt.read("taxi_raw").where(...) - #anomalies.write.format("delta").saveAsTable("class1") - diff --git a/python/tests/tests.py b/python/tests/tests.py index 5a32b916..fe3d7515 100644 --- a/python/tests/tests.py +++ b/python/tests/tests.py @@ -151,51 +151,6 @@ def test_describe(self): assert res.filter(F.col("min_ts") != " ").select(F.col('min_ts').cast("string")).collect()[0][0] == '2020-08-01 00:00:10' assert res.filter(F.col("max_ts") != " ").select(F.col('max_ts').cast("string")).collect()[0][0] == '2020-09-01 00:19:12' - def test_yaml_read(self): - """AS-OF Join with out a time-partition test""" - leftSchema = StructType([StructField("symbol", StringType()), - StructField("event_ts", StringType()), - StructField("trade_pr", FloatType())]) - - rightSchema = StructType([StructField("symbol", StringType()), - StructField("event_ts", StringType()), - StructField("bid_pr", FloatType()), - StructField("ask_pr", FloatType())]) - - expectedSchema = StructType([StructField("symbol", StringType()), - StructField("left_event_ts", StringType()), - StructField("left_trade_pr", FloatType()), - StructField("right_event_ts", StringType()), - StructField("right_bid_pr", FloatType()), - StructField("right_ask_pr", FloatType())]) - - left_data = [["S1", "2020-08-01 00:00:10", 349.21], - ["S1", "2020-08-01 00:01:12", 351.32], - ["S1", "2020-09-01 00:02:10", 361.1], - ["S1", "2020-09-01 00:19:12", 362.1]] - - right_data = [["S1", "2020-08-01 00:00:01", 345.11, 351.12], - ["S1", "2020-08-01 00:01:05", 348.10, 353.13], - ["S1", "2020-09-01 00:02:01", 358.93, 365.12], - ["S1", "2020-09-01 00:15:01", 359.21, 365.31]] - - expected_data = [ - ["S1", "2020-08-01 00:00:10", 349.21, "2020-08-01 00:00:01", 345.11, 351.12], - ["S1", "2020-08-01 00:01:12", 351.32, "2020-08-01 00:01:05", 348.10, 353.13], - ["S1", "2020-09-01 00:02:10", 361.1, "2020-09-01 00:02:01", 358.93, 365.12], - ["S1", "2020-09-01 00:19:12", 362.1, "2020-09-01 00:15:01", 359.21, 365.31]] - - # Construct dataframes - dfLeft = self.buildTestDF(leftSchema, left_data) - dfRight = self.buildTestDF(rightSchema, right_data) - dfExpected = self.buildTestDF(expectedSchema, expected_data, ["left_event_ts", "right_event_ts"]) - - # perform the join - self.spark.range(10).withColumn("event_ts", F.current_timestamp()).withColumn("winner", F.lit('DFP')).withColumn("advertiser_impressions", F.lit(100)).withColumn("clicks", F.lit(5)).write.option("overwriteSchema", "true").mode('overwrite').format("delta").saveAsTable("hourly_metrics") - self.spark.range(10).withColumn("event_ts", F.current_timestamp()).withColumn("winner", F.lit('DFP')).withColumn("advertiser_impressions", F.lit(100)).withColumn("clicks", F.lit(5)).write.option("overwriteSchema", "true").mode('overwrite').format("delta").saveAsTable("monthly_metrics") - file = "./ad.yaml" - res = calc_anomalies(self.spark, file) - class AsOfJoinTest(SparkTest): From cd16c100b5f86bb404db660e4705174bcdf2af26 Mon Sep 17 00:00:00 2001 From: Ricardo Portilla Date: Sun, 12 Sep 2021 17:53:18 -0400 Subject: [PATCH 18/39] remove anomaly detection code test file --- python/tests/ad.yaml | 18 ------------------ 1 file changed, 18 deletions(-) delete mode 100644 python/tests/ad.yaml diff --git a/python/tests/ad.yaml b/python/tests/ad.yaml deleted file mode 100644 index e91647a4..00000000 --- a/python/tests/ad.yaml +++ /dev/null @@ -1,18 +0,0 @@ -table1: - database : "default" - name : "hourly_metrics" - ts_col : "event_ts" - lookback_window : "84600" - mode : "new" - # include any grouping columns or metrics you wish to detect anomalies on - partition_cols : ["winner"] - metrics : ["advertiser_impressions"] -table2: - database : "default" - name : "monthly_metrics" - mode : "new" - ts_col : "event_ts" - lookback_window : "84600" - # include any grouping columns or metrics you wish to detect anomalies on - partition_cols : ["winner"] - metrics : ["advertiser_impressions", "clicks"] \ No newline at end of file From 73cb4473477076de59a3e6fdf4ab9e0477dd9d64 Mon Sep 17 00:00:00 2001 From: Ricardo Portilla Date: Sun, 12 Sep 2021 17:56:27 -0400 Subject: [PATCH 19/39] merging resample --- python/tempo/resample.py | 1 - 1 file changed, 1 deletion(-) diff --git a/python/tempo/resample.py b/python/tempo/resample.py index 367774ef..b78852b1 100644 --- a/python/tempo/resample.py +++ b/python/tempo/resample.py @@ -100,7 +100,6 @@ def aggregate(tsdf, freq, func, metricCols = None, prefix = None, fill = None): sel_and_sort = tsdf.partitionCols + [tsdf.ts_col] + sorted(non_part_cols) res = res.select(sel_and_sort) - fillW = Window.partitionBy(tsdf.partitionCols) imputes = res.select(*tsdf.partitionCols, f.min(tsdf.ts_col).over(fillW).alias("from"), f.max(tsdf.ts_col).over(fillW).alias("until")) \ From b1270824caab918814773805e9ed7587f144cb2e Mon Sep 17 00:00:00 2001 From: Ricardo Portilla Date: Sun, 12 Sep 2021 17:58:56 -0400 Subject: [PATCH 20/39] removing dbl tempo egg files --- .gitignore | 1 + python/dbl_tempo.egg-info/PKG-INFO | 222 ------------------ python/dbl_tempo.egg-info/SOURCES.txt | 14 -- .../dbl_tempo.egg-info/dependency_links.txt | 1 - python/dbl_tempo.egg-info/requires.txt | 3 - python/dbl_tempo.egg-info/top_level.txt | 1 - 6 files changed, 1 insertion(+), 241 deletions(-) delete mode 100644 python/dbl_tempo.egg-info/PKG-INFO delete mode 100644 python/dbl_tempo.egg-info/SOURCES.txt delete mode 100644 python/dbl_tempo.egg-info/dependency_links.txt delete mode 100644 python/dbl_tempo.egg-info/requires.txt delete mode 100644 python/dbl_tempo.egg-info/top_level.txt diff --git a/.gitignore b/.gitignore index 005d0473..cbb64078 100644 --- a/.gitignore +++ b/.gitignore @@ -20,6 +20,7 @@ scala/target/stream/* **/dist **/htmlcov **/tempo.egg-info +**/dbl_tempo.egg-info ## Python related files *.pyc diff --git a/python/dbl_tempo.egg-info/PKG-INFO b/python/dbl_tempo.egg-info/PKG-INFO deleted file mode 100644 index 8f110fc2..00000000 --- a/python/dbl_tempo.egg-info/PKG-INFO +++ /dev/null @@ -1,222 +0,0 @@ -Metadata-Version: 2.1 -Name: dbl-tempo -<<<<<<< HEAD -Version: 0.1.1 -Summary: Spark Time Series Utility Package -Home-page: https://github.com/databrickslabs/tempo -Author: Ricardo Portilla, Tristan Nixon, Max Thone, Sonali Guleria -Author-email: labs@databricks.com -======= -Version: 0.1.0 -Summary: Spark Time Series Utility Package -Home-page: https://github.com/databrickslabs/tempo -Author: Ricardo Portilla, Databricks -Author-email: ricardo.portilla@databricks.com ->>>>>>> 32f5fc30ce3e6578f9d6da4fc86d0e0bd26d4323 -License: UNKNOWN -Description: # tempo - Time Series Utilities for Data Teams Using Databricks - -

- -

- - - ## Project Description - The purpose of this project is to make time series manipulation with Spark simpler. Operations covered under this package include AS OF joins, rolling statistics with user-specified window lengths, featurization of time series using lagged values, and Delta Lake optimization on time and partition fields. - - [![codecov](https://codecov.io/gh/databrickslabs/tempo/branch/master/graph/badge.svg)](https://codecov.io/gh/databrickslabs/tempo) - - ## Using the Project - -<<<<<<< HEAD - Python - pip install in Databricks notebooks using: - - ``` - %pip install dbl-tempo -======= - Python install in Databricks notebooks using: - - ``` - %pip install -e git+https://github.com/databrickslabs/tempo.git#"egg=tempo&#subdirectory=python" ->>>>>>> 32f5fc30ce3e6578f9d6da4fc86d0e0bd26d4323 - ``` - - Install locally using: - - ``` -<<<<<<< HEAD - pip install dbl-tempo - ``` - -======= - pip install -e git+https://github.com/databrickslabs/tempo.git#"egg=tempo&#subdirectory=python" - ``` - - Scala installation: - - Once the jar is created (via the following instructions), upload the jar to Databricks for use in a notebook or job: - - ``` - cd scala/tempo - sbt package - ``` - - ->>>>>>> 32f5fc30ce3e6578f9d6da4fc86d0e0bd26d4323 - - ### Starting Point: TSDF object, a wrapper over a Spark data frame - The entry point into all features for time series analysis in tempo is a TSDF object which wraps the Spark data frame. At a high level, a TSDF contains a data frame which contains many smaller time series, one per partition key. In order to create a TSDF object, a distinguished timestamp column much be provided in order for sorting purposes for public methods. Optionally, a sequence number and partition columns can be provided as the assumptive columns on which to create new features from. Below are the public methods available for TSDF transformation and enrichment. - - #### Sample Reference Architecture for Capital Markets - -

- -

- - ## Quickstart - Python - - Data source is UCI public accelerometer data available at this URL https://archive.ics.uci.edu/ml/datasets/Heterogeneity+Activity+Recognition - - #### 0. Read in Data - - ``` - from pyspark.sql.functions import * - - phone_accel_df = spark.read.format("csv").option("header", "true").load("dbfs:/home/tempo/Phones_accelerometer").withColumn("event_ts", (col("Arrival_Time").cast("double")/1000).cast("timestamp")).withColumn("x", col("x").cast("double")).withColumn("y", col("y").cast("double")).withColumn("z", col("z").cast("double")).withColumn("event_ts_dbl", col("event_ts").cast("double")) - - from tempo import * - - phone_accel_tsdf = TSDF(phone_accel_df, ts_col="event_ts", partition_cols = ["User"]) - ``` - - #### 1. Resample and Visualize - - ###### Sample usage: -<<<<<<< HEAD - Possible values for frequency include patterns such as 1 minute, 4 hours, 2 days or simply sec, min, day. For the accepted functions to aggregate data, options are 'floor', 'ceil', 'min', 'max', 'mean'. Custom functions will be available in a future release. - - Note: You can upsample any missing values by using an option in the resample interface (fill = True) -======= - Possible values for frequency include patterns such as 1 minute, 4 hours, 2 days or simply sec, min, day. For the accepted functions to aggreagate data, options are floor, ceil, min, max, mean. Custom functions will be available in a future release. ->>>>>>> 32f5fc30ce3e6578f9d6da4fc86d0e0bd26d4323 - - ``` - # ts_col = timestamp column on which to sort fact and source table - # partition_cols - columns to use for partitioning the TSDF into more granular time series for windowing and sorting - - resampled_sdf = phone_accel_tsdf.resample(freq='min', func='floor') - resampled_pdf = resampled_sdf.df.filter(col('event_ts').cast("date") == "2015-02-23").toPandas() - - import plotly.graph_objs as go - import plotly.express as px - import pandas as pd - - # Plotly figure 1 - fig = px.line(resampled_pdf, x='event_ts', y='z', - color="User", - line_group="User", hover_name="User") - fig.update_layout(title='Phone Accelerometer Usage' , showlegend=False) - - fig.show() - ``` - - #### 2. AS OF Join - ##### This join uses windowing in order to select the latest record from a source table and merges this onto the base Fact table - - -

- -

- - - ``` - from pyspark.sql.functions import * - - watch_accel_df = spark.read.format("csv").option("header", "true").load("dbfs:/home/tempo/Watch_accelerometer").withColumn("event_ts", (col("Arrival_Time").cast("double")/1000).cast("timestamp")).withColumn("x", col("x").cast("double")).withColumn("y", col("y").cast("double")).withColumn("z", col("z").cast("double")).withColumn("event_ts_dbl", col("event_ts").cast("double")) - - watch_accel_tsdf = TSDF(watch_accel_df, ts_col="event_ts", partition_cols = ["User"]) - - # Applying AS OF join to TSDF datasets - joined_df = watch_accel_tsdf.asofJoin(phone_accel_tsdf, right_prefix="phone_accel").df - - joined_df.show(10, False) - ``` - - #### 3. Skew Join Optimized AS OF Join - - The purpose of the skew optimized as of join is to bucket each set of `partition_cols` to get the latest source record merged onto the fact table - - Parameters: - - ts_col = timestamp column for sorting - partition_cols = partition columns for defining granular time series for windowing and sorting - tsPartitionVal = value to break up each partition into time brackets - fraction = overlap fraction - right_prefix = prefix used for source columns when merged into fact table - - ``` - joined_df = watch_accel_tsdf.asofJoin(phone_accel_tsdf, right_prefix="watch_accel", tsPartitionVal = 10, fraction = 0.1).df - joined_df.show(10, False) - ``` - - #### 4 - Approximate Exponential Moving Average - - The approximate exponential moving average uses an approximation of the form `EMA = e * lag(col,0) + e * (1 - e) * lag(col, 1) + e * (1 - e)^2 * lag(col, 2) ` to define a rolling moving average based on exponential decay. - - Parameters: - - window = number of lagged values to compute for moving average - - ``` - ema_trades = watch_accel_tsdf.EMA("x", window = 50).df - ema_trades.show(10, False) - ``` - - #### 5 - Simple Moving Average - - Method for computing rolling statistics based on the distinguished timestamp column - - Parameters: - - rangeBackWindowSecs = number of seconds to look back - - ``` - moving_avg = watch_accel_tsdf.withRangeStats("y", rangeBackWindowSecs=600).df - moving_avg.select('event_ts', 'x', 'y', 'z', 'mean_y').show(10, False) -<<<<<<< HEAD - ``` -======= - `` ->>>>>>> 32f5fc30ce3e6578f9d6da4fc86d0e0bd26d4323 - - - - ## Project Support - Please note that all projects in the /databrickslabs github account are provided for your exploration only, and are not formally supported by Databricks with Service Level Agreements (SLAs). They are provided AS-IS and we do not make any guarantees of any kind. Please do not submit a support ticket relating to any issues arising from the use of these projects. - - Any issues discovered through the use of this project should be filed as GitHub Issues on the Repo. They will be reviewed as time permits, but there are no formal SLAs for support. - - ## Project Setup - After cloning the repo, it is highly advised that you create a [virtual environment](https://docs.python.org/3/library/venv.html) to isolate and manage - packages for this project, like so: - - `python -m venv /venv` - - You can then install the required modules via pip: - - `pip install requirements.txt` - - ## Building the Project - Once in the main project folder, build into a wheel using the following command: - - `python setup.py bdist_wheel` - - ## Releasing the Project - Instructions for how to release a version of the project - -Platform: UNKNOWN -Classifier: Programming Language :: Python :: 3 -Classifier: License :: OSI Approved :: MIT License -Classifier: Operating System :: OS Independent -Description-Content-Type: text/markdown -Provides-Extra: tests diff --git a/python/dbl_tempo.egg-info/SOURCES.txt b/python/dbl_tempo.egg-info/SOURCES.txt deleted file mode 100644 index 04ae4d44..00000000 --- a/python/dbl_tempo.egg-info/SOURCES.txt +++ /dev/null @@ -1,14 +0,0 @@ -<<<<<<< HEAD -README.md -======= ->>>>>>> 32f5fc30ce3e6578f9d6da4fc86d0e0bd26d4323 -setup.py -dbl_tempo.egg-info/PKG-INFO -dbl_tempo.egg-info/SOURCES.txt -dbl_tempo.egg-info/dependency_links.txt -dbl_tempo.egg-info/requires.txt -dbl_tempo.egg-info/top_level.txt -tempo/__init__.py -tempo/io.py -tempo/resample.py -tempo/tsdf.py \ No newline at end of file diff --git a/python/dbl_tempo.egg-info/dependency_links.txt b/python/dbl_tempo.egg-info/dependency_links.txt deleted file mode 100644 index 8b137891..00000000 --- a/python/dbl_tempo.egg-info/dependency_links.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/python/dbl_tempo.egg-info/requires.txt b/python/dbl_tempo.egg-info/requires.txt deleted file mode 100644 index 6f7494bd..00000000 --- a/python/dbl_tempo.egg-info/requires.txt +++ /dev/null @@ -1,3 +0,0 @@ - -[tests] -pytest diff --git a/python/dbl_tempo.egg-info/top_level.txt b/python/dbl_tempo.egg-info/top_level.txt deleted file mode 100644 index e764a30b..00000000 --- a/python/dbl_tempo.egg-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -tempo From bd059315256e74dc54d5d1fe4407e238708830ee Mon Sep 17 00:00:00 2001 From: Ricardo Portilla Date: Mon, 13 Sep 2021 14:43:01 -0400 Subject: [PATCH 21/39] removing dbl tempo egg files --- python/tempo/tsdf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/tempo/tsdf.py b/python/tempo/tsdf.py index 84105ea8..2031d1c6 100644 --- a/python/tempo/tsdf.py +++ b/python/tempo/tsdf.py @@ -243,9 +243,9 @@ def asofJoin(self, right_tsdf, left_prefix=None, right_prefix="right", tsPartiti new_left_cols = [f.col(c).alias(left_prefix + '_' + c) for c in left_cols] + partition_cols new_right_cols = [f.col(c).alias(right_prefix + '_' + c) for c in right_cols] + partition_cols quotes_df_w_lag = right_df.select(*new_right_cols).withColumn("lead_" + right_tsdf.ts_col, f.lead(right_prefix + '_' + right_tsdf.ts_col).over(w))#.withColumnRenamed(right_tsdf.ts_col, 'right_' + right_tsdf.ts_col) - quotes_df_w_lag_tsdf = TSDF(quotes_df_w_lag, partition_cols=right_tsdf.partitionCols, ts_col='right_' + right_tsdf.ts_col) + quotes_df_w_lag_tsdf = TSDF(quotes_df_w_lag, partition_cols=right_tsdf.partitionCols, ts_col= right_prefix + '_' + right_tsdf.ts_col) left_df = left_df.select(*new_left_cols) - res = left_df.join(quotes_df_w_lag, partition_cols).where(left_df[new_left_ts_col].between(f.col('right_' + right_tsdf.ts_col), f.coalesce(f.col('lead_' + right_tsdf.ts_col), f.lit('2099-01-01').cast("timestamp")))).drop('lead_' + right_tsdf.ts_col) + res = left_df.join(quotes_df_w_lag, partition_cols).where(left_df[new_left_ts_col].between(f.col(right_prefix + '_'+ right_tsdf.ts_col), f.coalesce(f.col('lead_' + right_tsdf.ts_col), f.lit('2099-01-01').cast("timestamp")))).drop('lead_' + right_tsdf.ts_col) return(TSDF(res, partition_cols=self.partitionCols, ts_col=new_left_ts_col)) # end of block checking to see if standard Spark SQL join will work From 30377cd0f9780d6832db2d1bf34124549c200153 Mon Sep 17 00:00:00 2001 From: Ricardo Portilla Date: Mon, 13 Sep 2021 15:10:20 -0400 Subject: [PATCH 22/39] removing dbl tempo egg files --- python/tempo/tsdf.py | 3 +++ python/tests/tests.py | 1 - 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/python/tempo/tsdf.py b/python/tempo/tsdf.py index 2031d1c6..21a55be2 100644 --- a/python/tempo/tsdf.py +++ b/python/tempo/tsdf.py @@ -239,12 +239,15 @@ def asofJoin(self, right_tsdf, left_prefix=None, right_prefix="right", tsPartiti right_cols = list(set(right_df.columns).difference(set(right_tsdf.partitionCols))) new_left_cols = left_cols if left_prefix: + print('in left prefix') new_left_ts_col = left_prefix + '_' + self.ts_col new_left_cols = [f.col(c).alias(left_prefix + '_' + c) for c in left_cols] + partition_cols new_right_cols = [f.col(c).alias(right_prefix + '_' + c) for c in right_cols] + partition_cols quotes_df_w_lag = right_df.select(*new_right_cols).withColumn("lead_" + right_tsdf.ts_col, f.lead(right_prefix + '_' + right_tsdf.ts_col).over(w))#.withColumnRenamed(right_tsdf.ts_col, 'right_' + right_tsdf.ts_col) quotes_df_w_lag_tsdf = TSDF(quotes_df_w_lag, partition_cols=right_tsdf.partitionCols, ts_col= right_prefix + '_' + right_tsdf.ts_col) left_df = left_df.select(*new_left_cols) + [print(c) for c in left_df.columns] + [print(c) for c in quotes_df_w_lag.columns] res = left_df.join(quotes_df_w_lag, partition_cols).where(left_df[new_left_ts_col].between(f.col(right_prefix + '_'+ right_tsdf.ts_col), f.coalesce(f.col('lead_' + right_tsdf.ts_col), f.lit('2099-01-01').cast("timestamp")))).drop('lead_' + right_tsdf.ts_col) return(TSDF(res, partition_cols=self.partitionCols, ts_col=new_left_ts_col)) # end of block checking to see if standard Spark SQL join will work diff --git a/python/tests/tests.py b/python/tests/tests.py index fe3d7515..c42e3a08 100644 --- a/python/tests/tests.py +++ b/python/tests/tests.py @@ -5,7 +5,6 @@ from pyspark.sql.types import * from tempo.tsdf import TSDF -from tempo.ad import * class SparkTest(unittest.TestCase): ## From 3c5debf85e2ea222c849ca49594be10b2300a9ac Mon Sep 17 00:00:00 2001 From: Ricardo Portilla Date: Mon, 13 Sep 2021 18:07:00 -0400 Subject: [PATCH 23/39] removing dbl tempo egg files --- python/tempo/tsdf.py | 22 ++++++++++++++-------- python/tests/tests.py | 3 +++ 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/python/tempo/tsdf.py b/python/tempo/tsdf.py index 21a55be2..b203d93b 100644 --- a/python/tempo/tsdf.py +++ b/python/tempo/tsdf.py @@ -234,21 +234,27 @@ def asofJoin(self, right_tsdf, left_prefix=None, right_prefix="right", tsPartiti if (left_bytes < bytes_threshold) | (right_bytes < bytes_threshold) | override_legacy: spark.conf.set("spark.databricks.optimizer.rangeJoin.binSize", 60) partition_cols = right_tsdf.partitionCols - w = Window.partitionBy(*partition_cols).orderBy(right_prefix + '_' + right_tsdf.ts_col) left_cols = list(set(left_df.columns).difference(set(self.partitionCols))) right_cols = list(set(right_df.columns).difference(set(right_tsdf.partitionCols))) new_left_cols = left_cols if left_prefix: - print('in left prefix') - new_left_ts_col = left_prefix + '_' + self.ts_col - new_left_cols = [f.col(c).alias(left_prefix + '_' + c) for c in left_cols] + partition_cols - new_right_cols = [f.col(c).alias(right_prefix + '_' + c) for c in right_cols] + partition_cols - quotes_df_w_lag = right_df.select(*new_right_cols).withColumn("lead_" + right_tsdf.ts_col, f.lead(right_prefix + '_' + right_tsdf.ts_col).over(w))#.withColumnRenamed(right_tsdf.ts_col, 'right_' + right_tsdf.ts_col) - quotes_df_w_lag_tsdf = TSDF(quotes_df_w_lag, partition_cols=right_tsdf.partitionCols, ts_col= right_prefix + '_' + right_tsdf.ts_col) + left_prefix += '_' + else: + left_prefix = '' + + if right_prefix != '': + right_prefix+= '_' + + w = Window.partitionBy(*partition_cols).orderBy(right_prefix + right_tsdf.ts_col) + new_left_ts_col = left_prefix + self.ts_col + new_left_cols = [f.col(c).alias(left_prefix + c) for c in left_cols] + partition_cols + new_right_cols = [f.col(c).alias(right_prefix + c) for c in right_cols] + partition_cols + quotes_df_w_lag = right_df.select(*new_right_cols).withColumn("lead_" + right_tsdf.ts_col, f.lead(right_prefix + right_tsdf.ts_col).over(w)) + quotes_df_w_lag_tsdf = TSDF(quotes_df_w_lag, partition_cols=right_tsdf.partitionCols, ts_col= right_prefix + right_tsdf.ts_col) left_df = left_df.select(*new_left_cols) [print(c) for c in left_df.columns] [print(c) for c in quotes_df_w_lag.columns] - res = left_df.join(quotes_df_w_lag, partition_cols).where(left_df[new_left_ts_col].between(f.col(right_prefix + '_'+ right_tsdf.ts_col), f.coalesce(f.col('lead_' + right_tsdf.ts_col), f.lit('2099-01-01').cast("timestamp")))).drop('lead_' + right_tsdf.ts_col) + res = left_df.join(quotes_df_w_lag, partition_cols).where(left_df[new_left_ts_col].between(f.col(right_prefix + right_tsdf.ts_col), f.coalesce(f.col('lead_' + right_tsdf.ts_col), f.lit('2099-01-01').cast("timestamp")))).drop('lead_' + right_tsdf.ts_col) return(TSDF(res, partition_cols=self.partitionCols, ts_col=new_left_ts_col)) # end of block checking to see if standard Spark SQL join will work diff --git a/python/tests/tests.py b/python/tests/tests.py index c42e3a08..c18bc3b8 100644 --- a/python/tests/tests.py +++ b/python/tests/tests.py @@ -212,8 +212,11 @@ def test_asof_join(self): self.assertDataFramesEqual(non_prefix_joined_df, noRightPrefixdfExpected) spark_sql_joined_df = tsdf_left.asofJoin(tsdf_right, left_prefix="left", right_prefix="right", override_legacy=True).df + spark_sql_joined_df.show(10, False) + dfExpected.show(10, False) self.assertDataFramesEqual(spark_sql_joined_df, dfExpected) + def test_sequence_number_sort(self): """Skew AS-OF Join with Partition Window Test""" leftSchema = StructType([StructField("symbol", StringType()), From d58f89e711d66aca807c96229ba2718bc35c925c Mon Sep 17 00:00:00 2001 From: Ricardo Portilla Date: Mon, 13 Sep 2021 21:18:22 -0400 Subject: [PATCH 24/39] removing dbl tempo egg files --- python/tempo/tsdf.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/python/tempo/tsdf.py b/python/tempo/tsdf.py index b203d93b..fe9a9561 100644 --- a/python/tempo/tsdf.py +++ b/python/tempo/tsdf.py @@ -252,8 +252,6 @@ def asofJoin(self, right_tsdf, left_prefix=None, right_prefix="right", tsPartiti quotes_df_w_lag = right_df.select(*new_right_cols).withColumn("lead_" + right_tsdf.ts_col, f.lead(right_prefix + right_tsdf.ts_col).over(w)) quotes_df_w_lag_tsdf = TSDF(quotes_df_w_lag, partition_cols=right_tsdf.partitionCols, ts_col= right_prefix + right_tsdf.ts_col) left_df = left_df.select(*new_left_cols) - [print(c) for c in left_df.columns] - [print(c) for c in quotes_df_w_lag.columns] res = left_df.join(quotes_df_w_lag, partition_cols).where(left_df[new_left_ts_col].between(f.col(right_prefix + right_tsdf.ts_col), f.coalesce(f.col('lead_' + right_tsdf.ts_col), f.lit('2099-01-01').cast("timestamp")))).drop('lead_' + right_tsdf.ts_col) return(TSDF(res, partition_cols=self.partitionCols, ts_col=new_left_ts_col)) # end of block checking to see if standard Spark SQL join will work From 58707a9f66b94aae8e37c8ed46d439d19d6da438 Mon Sep 17 00:00:00 2001 From: Souvik Pratiher <70095944+Spratiher9@users.noreply.github.com> Date: Tue, 28 Dec 2021 03:24:10 +0530 Subject: [PATCH 25/39] Fourier transform functionality release Q42021 (#111) * fourier transformation functionality in tempo * fourier transform method docstrings added * fourier transform unit test added * updating readme with the fourier transform usage and the fourier function's variable naming pattern standard * Updating requirements * minor logic correction of naming the data column as 'val' * adding the corrected buildTestDF and also adding pyarrow in requirements.txt * Fourier unit test fixed and contributions information updated * data column in tests and logic is corrected with the name changed to tdval * original contribution restoration * bringing the pandas_udf method inside the calling method to ensure the reference is not lost in the executors * committing the correct timestep variable position * adding self to timestep * inherit timestep directly from parameter * tidying up the codebase * removed the set_timestep method as it is no longer required * removing the unnecessary orderby * adding order by inside the pandas function * removed the redundant imports --- CONTRIBUTING.md | 2 +- README.md | 14 ++++++ python/README.md | 18 ++++--- python/requirements.txt | 4 +- python/tempo/tsdf.py | 102 +++++++++++++++++++++++++++++++++++----- python/tempo/utils.py | 26 ++++++---- python/tests/tests.py | 45 ++++++++++++++++++ 7 files changed, 183 insertions(+), 28 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c45bc7dd..3ca1e314 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -51,4 +51,4 @@ Authorized Users (please list Github usernames):** * Required field -** Please note that Authorized Users may not be immediately be granted authorization to submit Contributions; should more than one individual attempt to sign a CLA on behalf of a Corporation, the first such CLA will apply and later CLAs will be deemed void. +** Please note that Authorized Users may not be immediately be granted authorization to submit Contributions; should more than one individual attempt to sign a CLA on behalf of a Corporation, the first such CLA will apply and later CLAs will be deemed void. \ No newline at end of file diff --git a/README.md b/README.md index d693ebcf..7db5676c 100644 --- a/README.md +++ b/README.md @@ -163,6 +163,20 @@ moving_avg = watch_accel_tsdf.withRangeStats("y", rangeBackWindowSecs=600) moving_avg.select('event_ts', 'x', 'y', 'z', 'mean_y').show(10, False) ``` +#### 6 - Fourier Transform + +Method for transforming the time series to frequency domain based on the distinguished data column + +Parameters: + +timestep = timestep value to be used for getting the frequency scale + +valueCol = name of the time domain data column which will be transformed + +```python +ft_df = tsdf.fourier_transform(timestep=1, valueCol="data_col") +display(ft_df) +``` ## Project Support diff --git a/python/README.md b/python/README.md index 0911d702..380464e0 100644 --- a/python/README.md +++ b/python/README.md @@ -166,15 +166,21 @@ metrics : ["advertiser_impressions", "publisher_net_revenue"] The code to run to produce the stacked table with anomalies is: -``` -from tempo.tsdf import TSDF -from tempo.ad import * +#### 7 - Fourier Transform + +Method for transforming the time series to frequency domain based on the distinguished data column + +Parameters: -calc_anomalies(spark, 'ad.yaml') +timestep = timestep value to be used for getting the frequency scale + +valueCol = name of the time domain data column which will be transformed + +```python +ft_df = tsdf.fourier_transform(timestep=1, valueCol="data_col") +display(ft_df) ``` -The above yaml and code defines an output table with suffix ```_class1``. Select the results from your table in the metastore using this `SELECT` statement: -select * from tempo.revenue_hourly_2021_class1 ## Project Support Please note that all projects in the /databrickslabs github account are provided for your exploration only, and are not formally supported by Databricks with Service Level Agreements (SLAs). They are provided AS-IS and we do not make any guarantees of any kind. Please do not submit a support ticket relating to any issues arising from the use of these projects. diff --git a/python/requirements.txt b/python/requirements.txt index ef247cdd..828b41c5 100644 --- a/python/requirements.txt +++ b/python/requirements.txt @@ -1,10 +1,12 @@ +ipython==7.28.0 numpy==1.19.1 pandas==1.1.0 py4j==0.10.9 +pyarrow==6.0.1 pyspark==3.0.0 pyspark-stubs==3.0.0 python-dateutil==2.8.1 pytz==2020.1 +scipy==1.7.2 six==1.15.0 wheel==0.34.2 -ipython==7.28.0 \ No newline at end of file diff --git a/python/tempo/tsdf.py b/python/tempo/tsdf.py index 8d314f94..d65c5a11 100644 --- a/python/tempo/tsdf.py +++ b/python/tempo/tsdf.py @@ -1,16 +1,18 @@ -import tempo.resample as rs -import tempo.io as tio - from pyspark.sql import SparkSession -from tempo.utils import ENV_BOOLEAN, PLATFORM -from IPython.display import display as ipydisplay -from IPython.core.display import HTML import logging from functools import reduce +import numpy as np import pyspark.sql.functions as f +from IPython.core.display import HTML +from IPython.display import display as ipydisplay from pyspark.sql.window import Window +from scipy.fft import fft, fftfreq + +import tempo.io as tio +import tempo.resample as rs +from tempo.utils import ENV_BOOLEAN, PLATFORM logger = logging.getLogger(__name__) @@ -75,12 +77,12 @@ def __addPrefixToColumns(self,col_list,prefix): Add prefix to all specified columns. """ - df = reduce(lambda df, idx: df.withColumnRenamed(col_list[idx], ''.join([prefix,col_list[idx]])), + df = reduce(lambda df, idx: df.withColumnRenamed(col_list[idx], '_'.join([prefix, col_list[idx]])), range(len(col_list)), self.df) - ts_col = ''.join([prefix, self.ts_col]) - seq_col = ''.join([prefix, self.sequence_col]) if self.sequence_col else self.sequence_col - return TSDF(df, ts_col, self.partitionCols, sequence_col = seq_col) + ts_col = '_'.join([prefix, self.ts_col]) + seq_col = '_'.join([prefix, self.sequence_col]) if self.sequence_col else self.sequence_col + return TSDF(df, ts_col, self.partitionCols, sequence_col=seq_col) def __addColumnsFromOtherDF(self, other_cols): """ @@ -290,7 +292,7 @@ def asofJoin(self, right_tsdf, left_prefix=None, right_prefix="right", tsPartiti :param fraction - overlap fraction """ - # first block of logic checks whether a standard range join will suffice + # first block of logic checks whether a standard range join will suffice left_df = self.df right_df = right_tsdf.df @@ -313,7 +315,7 @@ def asofJoin(self, right_tsdf, left_prefix=None, right_prefix="right", tsPartiti left_prefix += '_' else: left_prefix = '' - + if right_prefix != '': right_prefix+= '_' @@ -574,3 +576,79 @@ def calc_bars(tsdf, freq, func = None, metricCols = None, fill = None): bars = bars.select(sel_and_sort) return(TSDF(bars, resample_open.ts_col, resample_open.partitionCols)) + + def fourier_transform(self, timestep, valueCol): + """ + Function to fourier transform the time series to its frequency domain representation. + :param timestep: timestep value to be used for getting the frequency scale + :param valueCol: name of the time domain data column which will be transformed + """ + + def tempo_fourier_util(pdf): + """ + This method is a vanilla python logic implementing fourier transform on a numpy array using the scipy module. + This method is meant to be called from Tempo TSDF as a pandas function API on Spark + """ + select_cols = list(pdf.columns) + pdf.sort_values(by=['tpoints'], inplace=True, ascending=True) + y = np.array(pdf['tdval']) + tran = fft(y) + r = tran.real + i = tran.imag + pdf['ft_real'] = r + pdf['ft_imag'] = i + N = tran.shape + xf = fftfreq(N[0], timestep) + pdf['freq'] = xf + return pdf[select_cols + ['freq', 'ft_real', 'ft_imag']] + + valueCol = self.__validated_column(self.df, valueCol) + data = self.df + if self.sequence_col: + if self.partitionCols == []: + data = data.withColumn("dummy_group", f.lit("dummy_val")) + data = data.select(f.col("dummy_group"), self.ts_col, self.sequence_col, f.col(valueCol)).withColumn( + "tdval", f.col(valueCol)).withColumn("tpoints", f.col(self.ts_col)) + return_schema = ",".join( + [f"{i[0]} {i[1]}" for i in data.dtypes] + + + ["freq double", "ft_real double", "ft_imag double"] + ) + result = data.groupBy("dummy_group").applyInPandas(tempo_fourier_util, return_schema) + result = result.drop("dummy_group", "tdval", "tpoints") + else: + group_cols = self.partitionCols + data = data.select(*group_cols, self.ts_col, self.sequence_col, f.col(valueCol)).withColumn( + "tdval", f.col(valueCol)).withColumn("tpoints", f.col(self.ts_col)) + return_schema = ",".join( + [f"{i[0]} {i[1]}" for i in data.dtypes] + + + ["freq double", "ft_real double", "ft_imag double"] + ) + result = data.groupBy(*group_cols).applyInPandas(tempo_fourier_util, return_schema) + result = result.drop("tdval", "tpoints") + else: + if self.partitionCols == []: + data = data.withColumn("dummy_group", f.lit("dummy_val")) + data = data.select(f.col("dummy_group"), self.ts_col, f.col(valueCol)).withColumn( + "tdval", f.col(valueCol)).withColumn("tpoints", f.col(self.ts_col)) + return_schema = ",".join( + [f"{i[0]} {i[1]}" for i in data.dtypes] + + + ["freq double", "ft_real double", "ft_imag double"] + ) + result = data.groupBy("dummy_group").applyInPandas(tempo_fourier_util, return_schema) + result = result.drop("dummy_group", "tdval", "tpoints") + else: + group_cols = self.partitionCols + data = data.select(*group_cols, self.ts_col, f.col(valueCol)).withColumn( + "tdval", f.col(valueCol)).withColumn("tpoints", f.col(self.ts_col)) + return_schema = ",".join( + [f"{i[0]} {i[1]}" for i in data.dtypes] + + + ["freq double", "ft_real double", "ft_imag double"] + ) + result = data.groupBy(*group_cols).applyInPandas(tempo_fourier_util, return_schema) + result = result.drop("tdval", "tpoints") + + return TSDF(result, self.ts_col, self.partitionCols, self.sequence_col) diff --git a/python/tempo/utils.py b/python/tempo/utils.py index a59556d5..080bafea 100644 --- a/python/tempo/utils.py +++ b/python/tempo/utils.py @@ -1,11 +1,11 @@ -from IPython.display import display as ipydisplay -from IPython.core.display import HTML -from IPython import get_ipython -import os import logging -from pyspark.sql.dataframe import DataFrame -from pandas import DataFrame as pandasDataFrame +import os +from IPython import get_ipython +from IPython.core.display import HTML +from IPython.display import display as ipydisplay +from pandas import DataFrame as pandasDataFrame +from pyspark.sql.dataframe import DataFrame logger = logging.getLogger(__name__) PLATFORM = "DATABRICKS" if "DATABRICKS_RUNTIME_VERSION" in os.environ.keys() else "NON_DATABRICKS" @@ -14,6 +14,7 @@ where the code is running from. """ + def __isnotebookenv(): """ This method returns a boolean value signifying whether the environment is a notebook environment @@ -30,28 +31,33 @@ def __isnotebookenv(): except NameError: return False + def display_html(df): """ Display method capable of displaying the dataframe in a formatted HTML structured output """ ipydisplay(HTML("")) - if isinstance(df,DataFrame): + if isinstance(df, DataFrame): df.show(truncate=False, vertical=False) elif isinstance(df, pandasDataFrame): df.head() else: logger.error("'display' method not available for this object") + def display_unavailable(df): """ This method is called when display method is not available in the environment. """ logger.error("'display' method not available in this environment. Use 'show' method instead.") + ENV_BOOLEAN = __isnotebookenv() if PLATFORM == "DATABRICKS": method = get_ipython().user_ns['display'] + + # Under 'display' key in user_ns the original databricks display method is present # to know more refer: /databricks/python_shell/scripts/db_ipykernel_launcher.py def display_improvised(obj): @@ -59,6 +65,8 @@ def display_improvised(obj): method(obj.df) else: method(obj) + + display = display_improvised elif __isnotebookenv(): def display_html_improvised(obj): @@ -66,8 +74,10 @@ def display_html_improvised(obj): display_html(obj.df) else: display_html(obj) + + display = display_html_improvised -else: +else: display = display_unavailable """ diff --git a/python/tests/tests.py b/python/tests/tests.py index d187e88d..d5ed719d 100644 --- a/python/tests/tests.py +++ b/python/tests/tests.py @@ -330,6 +330,51 @@ def test_partitioned_asof_join(self): self.assertDataFramesEqual(joined_df, dfExpected) +class FourierTransformTest(SparkTest): + + def test_fourier_transform(self): + """Test of fourier transform functionality in TSDF objects""" + schema = StructType([StructField("group",StringType()), + StructField("time",LongType()), + StructField("val",DoubleType())]) + + expectedSchema = StructType([StructField("group",StringType()), + StructField("time",LongType()), + StructField("val",DoubleType()), + StructField("freq",DoubleType()), + StructField("ft_real",DoubleType()), + StructField("ft_imag",DoubleType())]) + + data = [["Emissions", 1949, 2206.690829], + ["Emissions", 1950, 2382.046176], + ["Emissions", 1951, 2526.687327], + ["Emissions", 1952, 2473.373964], + ["WindGen", 1980, 0.0], + ["WindGen", 1981, 0.0], + ["WindGen", 1982, 0.0], + ["WindGen", 1983, 0.029667962]] + + expected_data = [["Emissions", 1949, 2206.690829, 0.0, 9588.798296, -0.0], + ["Emissions", 1950, 2382.046176, 0.25, -319.996498, 91.32778800000006], + ["Emissions", 1951, 2526.687327, -0.5, -122.0419839999995, -0.0], + ["Emissions", 1952, 2473.373964, -0.25, -319.996498, -91.32778800000006], + ["WindGen", 1980, 0.0, 0.0, 0.029667962, -0.0], + ["WindGen", 1981, 0.0, 0.25, 0.0, 0.029667962], + ["WindGen", 1982, 0.0, -0.5, -0.029667962, -0.0], + ["WindGen", 1983, 0.029667962, -0.25, 0.0, -0.029667962]] + + # construct dataframes + df = self.buildTestDF(schema, data, ts_cols=['time']) + dfExpected = self.buildTestDF(expectedSchema, expected_data, ts_cols=['time']) + + # convert to TSDF + tsdf_left = TSDF(df, ts_col="time", partition_cols=["group"]) + result_tsdf = tsdf_left.fourier_transform(1, 'val') + + # should be equal to the expected dataframe + self.assertDataFramesEqual(result_tsdf.df, dfExpected) + + class RangeStatsTest(SparkTest): def test_range_stats(self): From 332779258b314bc210cae24881e2b8de0a091c2c Mon Sep 17 00:00:00 2001 From: rportilla-databricks <38080604+rportilla-databricks@users.noreply.github.com> Date: Sat, 8 Jan 2022 20:48:07 -0500 Subject: [PATCH 26/39] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 7db5676c..5ab64891 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,7 @@ The purpose of this project is to make time series manipulation with Spark simpler. Operations covered under this package include AS OF joins, rolling statistics with user-specified window lengths, featurization of time series using lagged values, and Delta Lake optimization on time and partition fields. [![codecov](https://codecov.io/gh/databrickslabs/tempo/branch/master/graph/badge.svg)](https://codecov.io/gh/databrickslabs/tempo) +[![PyPI version](https://badge.fury.io/py/dbl-tempo.svg)](https://badge.fury.io/py/dbl-tempo) ## Using the Project From 4eb3e8a157418b96384fe387bfd4b37ccd6d5457 Mon Sep 17 00:00:00 2001 From: Ricardo Portilla Date: Tue, 11 Jan 2022 23:27:09 -0500 Subject: [PATCH 27/39] fixing workflows --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index d98cb17a..25b64f73 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -1,7 +1,7 @@ name: build on: push: - branches: [master, release_Q42021] + branches: [master] jobs: run: runs-on: ${{ matrix.os }} From c43888ffe01fd8a810881b34fcf2998789e7e8ae Mon Sep 17 00:00:00 2001 From: Guanjie Shen <75445106+guanjieshen@users.noreply.github.com> Date: Thu, 20 Jan 2022 14:22:08 -0700 Subject: [PATCH 28/39] feature: add interpolation functionality (#109) * feat: add interpolation * feat(interpolation): add support for multuple partitions, and target columns * test: add interpolation zero fill test * test: add additional interpolation tests * chore: convert linear interpolation to use spark native functions * chore: allow for interpolation to be called directly from the TSDF object * chore: update series fill logic * chore: change default behaviour for target_cols * chore: rename to be more consistent with pandas and the tsdf class * chore(interpolation): make show if interpolated column optional * chore(interpolation): remove caching * Troubleshooting (#2) * Refactor interpolation code to remove joins, and double` resample` * Added additional test coverage to interpolation code * Updated `test` folder structure Co-authored-by: Guanjie Shen * chore: add additional comments * chore: update branches in test.yml * fix: update interpolate_column params * chore: add interpolation details in readme.md * chore: update main readme.md * chore: update main readme.md * Merge branch 'master' of github.com:guanjieshen/tempo * chore: make readme more consistent * chore: add build and downloads badge to readme * changes * fix: fourier test java error * fix: try to configure netty changes so tests for fourier will work * change * housekeeping: organize imports on tsdf.py * chore(interpolation): change back to bfill, change forward to ffill * interpolation: add the ability to call interpolate after resample * housekeeping: add missing type hint * chore(interpolate): update readme * chore: update interpolation documentation to be more clear * adding one unit test Co-authored-by: Guanjie Shen Co-authored-by: Ricardo Portilla --- .github/workflows/test.yml | 4 +- .gitignore | 4 +- README.md | 74 +++ python/README.md | 73 +++ python/requirements.txt | 1 + python/setup.py | 3 +- python/tempo/__init__.py | 2 +- python/tempo/interpol.py | 378 +++++++++++++++ python/tempo/resample.py | 2 +- python/tempo/tsdf.py | 87 +++- python/tests/interpol_tests.py | 591 +++++++++++++++++++++++ python/tests/{tests.py => tsdf_tests.py} | 4 +- 12 files changed, 1211 insertions(+), 12 deletions(-) create mode 100644 python/tempo/interpol.py create mode 100644 python/tests/interpol_tests.py rename python/tests/{tests.py => tsdf_tests.py} (99%) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 25b64f73..29d1310b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -20,13 +20,13 @@ jobs: - name: Set Spark env run: | export SPARK_LOCAL_IP=127.0.0.1 + export SPARK_SUBMIT_OPTS="--illegal-access=permit -Dio.netty.tryReflectionSetAccessible=true" - name: Generate coverage report working-directory: ./python run: | pip install -r requirements.txt pip install coverage - coverage run -m unittest + coverage run -m unittest discover -s tests -p '*_tests.py' coverage xml - - name: Publish test coverage uses: codecov/codecov-action@v1 diff --git a/.gitignore b/.gitignore index 9651ee70..f41edb82 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,8 @@ -# ignore IntelliJ/PyCharm IDE files +# ignore IntelliJ/PyCharm/VSCode IDE files .idea *.iml +.vscode + # coverage files .coverage diff --git a/README.md b/README.md index 5ab64891..677ccb01 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,9 @@ ## Project Description The purpose of this project is to make time series manipulation with Spark simpler. Operations covered under this package include AS OF joins, rolling statistics with user-specified window lengths, featurization of time series using lagged values, and Delta Lake optimization on time and partition fields. +[![image](https://github.com/databrickslabs/tempo/workflows/build/badge.svg)](https://github.com/databrickslabs/tempo/actions?query=workflow%3Abuild) [![codecov](https://codecov.io/gh/databrickslabs/tempo/branch/master/graph/badge.svg)](https://codecov.io/gh/databrickslabs/tempo) +[![Downloads](https://pepy.tech/badge/dbl-tempo/month)](https://pepy.tech/project/dbl-tempo) [![PyPI version](https://badge.fury.io/py/dbl-tempo.svg)](https://badge.fury.io/py/dbl-tempo) ## Using the Project @@ -164,6 +166,7 @@ moving_avg = watch_accel_tsdf.withRangeStats("y", rangeBackWindowSecs=600) moving_avg.select('event_ts', 'x', 'y', 'z', 'mean_y').show(10, False) ``` + #### 6 - Fourier Transform Method for transforming the time series to frequency domain based on the distinguished data column @@ -178,7 +181,78 @@ valueCol = name of the time domain data column which will be transformed ft_df = tsdf.fourier_transform(timestep=1, valueCol="data_col") display(ft_df) ``` +#### 7 - Interpolation + +Interpolate a series to fill in missing values using a specified function. The following interpolation methods are supported: + +- Zero Fill : `zero` +- Null Fill: `null` +- Backwards Fill: `bfill` +- Forwards Fill: `ffill` +- Linear Fill: `linear` + +The `interpolate` method can either be use in conjunction with `resample` or independently. + +If `interpolate` is not chained after a `resample` operation, the method automatically first re-samples the input dataset into a given frequency, then performs interpolation on the sampled time-series dataset. + +Possible values for frequency include patterns such as 1 minute, 4 hours, 2 days or simply sec, min, day. For the accepted functions to aggregate data, options are 'floor', 'ceil', 'min', 'max', 'mean'. +`NULL` values after re-sampling are treated the same as missing values. Ability to specify `NULL` as a valid value is currently not supported. + +Valid columns data types for interpolation are: `["int", "bigint", "float", "double"]`. + +```python +# Create instance of the TSDF class +input_tsdf = TSDF( + input_df, + partition_cols=["partition_a", "partition_b"], + ts_col="event_ts", + ) + + +# What the following chain of operation does is: +# 1. Aggregate all valid numeric columns using mean into 30 second intervals +# 2. Interpolate any missing intervals or null values using linear fill +# Note: When chaining interpolate after a resample, there is no need to provide a freq or func parameter. Only method is required. +interpolated_tsdf = input_tsdf.resample(freq="30 seconds", func="mean").interpolate( + method="linear" +) + +# What the following interpolation method does is: +# 1. Aggregate columnA and columnBN using mean into 30 second intervals +# 2. Interpolate any missing intervals or null values using linear fill +interpolated_tsdf = input_tsdf.interpolate( + freq="30 seconds", + func="mean", + target_cols= ["columnA","columnB"], + method="linear" + +) + +# Alternatively it's also possible to override default TSDF parameters. +# e.g. partition_cols, ts_col a +interpolated_tsdf = input_tsdf.interpolate( + partition_cols=["partition_c"], + ts_col="other_event_ts" + freq="30 seconds", + func="mean", + target_cols= ["columnA","columnB"], + method="linear" +) + +# The show_interpolated flag can be set to `True` to show additional boolean columns +# for a given row that shows if a column has been interpolated. +interpolated_tsdf = input_tsdf.interpolate( + partition_cols=["partition_c"], + ts_col="other_event_ts" + freq="30 seconds", + func="mean", + method="linear", + target_cols= ["columnA","columnB"], + show_interpolated=True, +) + +``` ## Project Support Please note that all projects in the /databrickslabs github account are provided for your exploration only, and are not formally supported by Databricks with Service Level Agreements (SLAs). They are provided AS-IS and we do not make any guarantees of any kind. Please do not submit a support ticket relating to any issues arising from the use of these projects. diff --git a/python/README.md b/python/README.md index 380464e0..605d23cf 100644 --- a/python/README.md +++ b/python/README.md @@ -8,7 +8,9 @@ ## Project Description The purpose of this project is to make time series manipulation with Spark simpler. Operations covered under this package include AS OF joins, rolling statistics with user-specified window lengths, featurization of time series using lagged values, and Delta Lake optimization on time and partition fields. +[![image](https://github.com/databrickslabs/tempo/workflows/build/badge.svg)](https://github.com/databrickslabs/tempo/actions?query=workflow%3Abuild) [![codecov](https://codecov.io/gh/databrickslabs/tempo/branch/master/graph/badge.svg)](https://codecov.io/gh/databrickslabs/tempo) +[![Downloads](https://pepy.tech/badge/dbl-tempo/month)](https://pepy.tech/project/dbl-tempo) ## Using the Project @@ -181,6 +183,77 @@ ft_df = tsdf.fourier_transform(timestep=1, valueCol="data_col") display(ft_df) ``` +#### 8- Interpolation +Interpolate a series to fill in missing values using a specified function. The following interpolation methods are supported: + +- Zero Fill : `zero` +- Null Fill: `null` +- Backwards Fill: `bfill` +- Forwards Fill: `ffill` +- Linear Fill: `linear` + +The `interpolate` method can either be use in conjunction with `resample` or independently. + +If `interpolate` is not chained after a `resample` operation, the method automatically first re-samples the input dataset into a given frequency, then performs interpolation on the sampled time-series dataset. + +Possible values for frequency include patterns such as 1 minute, 4 hours, 2 days or simply sec, min, day. For the accepted functions to aggregate data, options are 'floor', 'ceil', 'min', 'max', 'mean'. + +`NULL` values after re-sampling are treated the same as missing values. Ability to specify `NULL` as a valid value is currently not supported. + +Valid columns data types for interpolation are: `["int", "bigint", "float", "double"]`. + +```python +# Create instance of the TSDF class +input_tsdf = TSDF( + input_df, + partition_cols=["partition_a", "partition_b"], + ts_col="event_ts", + ) + + +# What the following chain of operation does is: +# 1. Aggregate all valid numeric columns using mean into 30 second intervals +# 2. Interpolate any missing intervals or null values using linear fill +# Note: When chaining interpolate after a resample, there is no need to provide a freq or func parameter. Only method is required. +interpolated_tsdf = input_tsdf.resample(freq="30 seconds", func="mean").interpolate( + method="linear" +) + +# What the following interpolation method does is: +# 1. Aggregate columnA and columnBN using mean into 30 second intervals +# 2. Interpolate any missing intervals or null values using linear fill +interpolated_tsdf = input_tsdf.interpolate( + freq="30 seconds", + func="mean", + target_cols= ["columnA","columnB"], + method="linear" + +) + +# Alternatively it's also possible to override default TSDF parameters. +# e.g. partition_cols, ts_col a +interpolated_tsdf = input_tsdf.interpolate( + partition_cols=["partition_c"], + ts_col="other_event_ts" + freq="30 seconds", + func="mean", + target_cols= ["columnA","columnB"], + method="linear" +) + +# The show_interpolated flag can be set to `True` to show additional boolean columns +# for a given row that shows if a column has been interpolated. +interpolated_tsdf = input_tsdf.interpolate( + partition_cols=["partition_c"], + ts_col="other_event_ts" + freq="30 seconds", + func="mean", + method="linear", + target_cols= ["columnA","columnB"], + show_interpolated=True, +) + +``` ## Project Support Please note that all projects in the /databrickslabs github account are provided for your exploration only, and are not formally supported by Databricks with Service Level Agreements (SLAs). They are provided AS-IS and we do not make any guarantees of any kind. Please do not submit a support ticket relating to any issues arising from the use of these projects. diff --git a/python/requirements.txt b/python/requirements.txt index 828b41c5..4e755deb 100644 --- a/python/requirements.txt +++ b/python/requirements.txt @@ -1,5 +1,6 @@ ipython==7.28.0 numpy==1.19.1 +chispa==0.8.2 pandas==1.1.0 py4j==0.10.9 pyarrow==6.0.1 diff --git a/python/setup.py b/python/setup.py index 63fd6913..db722c9b 100644 --- a/python/setup.py +++ b/python/setup.py @@ -16,7 +16,8 @@ packages=find_packages(where=".", include=["tempo"]), install_requires=[ 'ipython', - 'pandas' + 'pandas', + 'scipy' ], extras_require=dict(tests=["pytest"]), classifiers=[ diff --git a/python/tempo/__init__.py b/python/tempo/__init__.py index 80d25720..51546de6 100644 --- a/python/tempo/__init__.py +++ b/python/tempo/__init__.py @@ -1,2 +1,2 @@ from tempo.tsdf import TSDF -from tempo.utils import display +from tempo.utils import display \ No newline at end of file diff --git a/python/tempo/interpol.py b/python/tempo/interpol.py new file mode 100644 index 00000000..a980ee9b --- /dev/null +++ b/python/tempo/interpol.py @@ -0,0 +1,378 @@ +import sys +from typing import List + +from pyspark.sql.dataframe import DataFrame +from pyspark.sql.functions import col, expr, first, last, lead, lit, when +from pyspark.sql.window import Window + +# Interpolation fill options +method_options = ["zero", "null", "bfill", "ffill", "linear"] +supported_target_col_types = ["int", "bigint", "float", "double"] + + +class Interpolation: + def __init__(self, is_resampled: bool): + self.is_resampled = is_resampled + + def __validate_fill(self, method: str): + """ + Validate if the fill provided is within the allowed list of values. + + :param fill - Fill type e.g. "zero", "null", "bfill", "ffill", "linear" + """ + if method not in method_options: + raise ValueError( + f"Please select from one of the following fill options: {method_options}" + ) + + def __validate_col( + self, + df: DataFrame, + partition_cols: List[str], + target_cols: List[str], + ts_col: str, + ): + """ + Validate if target column exists and is of numeric type, and validates if partition column exists. + + :param df - DataFrame to be validated + :param partition_cols - Partition columns to be validated + :param target_col - Target column to be validated + :param ts_col - Timestamp column to be validated + """ + for column in partition_cols: + if column not in str(df.columns): + raise ValueError( + f"Partition Column: '{column}' does not exist in DataFrame." + ) + for column in target_cols: + if column not in str(df.columns): + raise ValueError( + f"Target Column: '{column}' does not exist in DataFrame." + ) + if df.select(column).dtypes[0][1] not in supported_target_col_types: + raise ValueError( + f"Target Column needs to be one of the following types: {supported_target_col_types}" + ) + + if ts_col not in str(df.columns): + raise ValueError( + f"Timestamp Column: '{ts_col}' does not exist in DataFrame." + ) + + if df.select(ts_col).dtypes[0][1] != "timestamp": + raise ValueError(f"Timestamp Column needs to be of timestamp type.") + + def __calc_linear_spark(self, df: DataFrame, ts_col: str, target_col: str): + """ + Native Spark function for calculating linear interpolation on a DataFrame. + + :param df - prepared dataframe to be interpolated + :param ts_col - timeseries column name + :param target_col - column to be interpolated + """ + interpolation_expr = f""" + case when is_interpolated_{target_col} = false then {target_col} + when {target_col} is null then + (next_null_{target_col} - previous_{target_col}) + /(unix_timestamp(next_timestamp_{target_col})-unix_timestamp(previous_timestamp_{target_col})) + *(unix_timestamp({ts_col}) - unix_timestamp(previous_timestamp_{target_col})) + + previous_{target_col} + else + (next_{target_col}-{target_col}) + /(unix_timestamp(next_timestamp)-unix_timestamp(previous_timestamp)) + *(unix_timestamp({ts_col}) - unix_timestamp(previous_timestamp)) + + {target_col} + end as {target_col} + """ + + # remove target column to avoid duplication during interpolation expression + cols: List[str] = df.columns + cols.remove(target_col) + interpolated: DataFrame = df.selectExpr(*cols, interpolation_expr) + # Preserve column order + return interpolated.select(*df.columns) + + def __interpolate_column( + self, + series: DataFrame, + ts_col: str, + target_col: str, + method: str, + ) -> DataFrame: + """ + Apply interpolation to column. + + :param series - input DataFrame + :param ts_col - timestamp column name + :param target_col - column to interpolate + :param method - interpolation function to fill missing values + """ + output_df: DataFrame = series + + # create new column for if target column is interpolated + flag_expr = f""" + CASE WHEN {target_col} is null and is_ts_interpolated = false THEN true + WHEN is_ts_interpolated = true THEN true + ELSE false + END AS is_interpolated_{target_col} + """ + output_df = output_df.withColumn( + f"is_interpolated_{target_col}", expr(flag_expr) + ) + + # Handle zero fill + if method == "zero": + output_df = output_df.withColumn( + target_col, + when( + col(f"is_interpolated_{target_col}") == False, col(target_col) + ).otherwise(lit(0)), + ) + + # Handle null fill + if method == "null": + output_df = output_df.withColumn( + target_col, + when( + col(f"is_interpolated_{target_col}") == False, col(target_col) + ).otherwise(None), + ) + + # Handle forward fill + if method == "ffill": + output_df = output_df.withColumn( + target_col, + when( + col(f"is_interpolated_{target_col}") == True, + col(f"previous_{target_col}"), + ).otherwise(col(target_col)), + ) + # Handle backwards fill + if method == "bfill": + output_df = output_df.withColumn( + target_col, + # Handle case when subsequent value is null + when( + (col(f"is_interpolated_{target_col}") == True) + & ( + col(f"next_{target_col}").isNull() + & (col(f"{ts_col}_{target_col}").isNull()) + ), + col(f"next_null_{target_col}"), + ).otherwise( + # Handle standard backwards fill + when( + col(f"is_interpolated_{target_col}") == True, + col(f"next_{target_col}"), + ).otherwise(col(f"{target_col}")) + ), + ) + + # Handle linear fill + if method == "linear": + output_df = self.__calc_linear_spark( + output_df, + ts_col, + target_col, + ) + + return output_df + + def __generate_time_series_fill( + self, df: DataFrame, partition_cols: List[str], ts_col: str + ) -> DataFrame: + """ + Create additional timeseries columns for previous and next timestamps + + :param df - input DataFrame + :param partition_cols - partition column names + :param ts_col - timestamp column name + """ + return df.withColumn("previous_timestamp", col(ts_col),).withColumn( + "next_timestamp", + lead(df[ts_col]).over(Window.partitionBy(*partition_cols).orderBy(ts_col)), + ) + + def __generate_column_time_fill( + self, df: DataFrame, partition_cols: List[str], ts_col: str, target_col: str + ) -> DataFrame: + """ + Create timeseries columns for previous and next timestamps for a specific target column + + :param df - input DataFrame + :param partition_cols - partition column names + :param ts_col - timestamp column name + :param target_col - target column name + """ + return df.withColumn( + f"previous_timestamp_{target_col}", + last(col(f"{ts_col}_{target_col}"), ignorenulls=True).over( + Window.partitionBy(*partition_cols) + .orderBy(ts_col) + .rowsBetween(-sys.maxsize, 0) + ), + ).withColumn( + f"next_timestamp_{target_col}", + first(col(f"{ts_col}_{target_col}"), ignorenulls=True).over( + Window.partitionBy(*partition_cols) + .orderBy(ts_col) + .rowsBetween(0, sys.maxsize) + ), + ) + + def __generate_target_fill( + self, df: DataFrame, partition_cols: List[str], ts_col: str, target_col: str + ) -> DataFrame: + """ + Create columns for previous and next value for a specific target column + + :param df - input DataFrame + :param partition_cols - partition column names + :param ts_col - timestamp column name + :param target_col - target column name + """ + return ( + df.withColumn( + f"previous_{target_col}", + last(df[target_col], ignorenulls=True).over( + Window.partitionBy(*partition_cols) + .orderBy(ts_col) + .rowsBetween(-sys.maxsize, 0) + ), + ) + # Handle if subsequent value is null + .withColumn( + f"next_null_{target_col}", + first(df[target_col], ignorenulls=True).over( + Window.partitionBy(*partition_cols) + .orderBy(ts_col) + .rowsBetween(0, sys.maxsize) + ), + ).withColumn( + f"next_{target_col}", + lead(df[target_col]).over( + Window.partitionBy(*partition_cols).orderBy(ts_col) + ), + ) + ) + + def interpolate( + self, + tsdf, + ts_col: str, + partition_cols: List[str], + target_cols: List[str], + freq: str, + func: str, + method: str, + show_interpolated: bool, + ) -> DataFrame: + """ + Apply interpolation. + + :param tsdf - input TSDF + :param ts_col - timestamp column name + :param target_cols - numeric columns to interpolate + :param partition_cols - partition columns names + :param freq - frequency at which to sample + :param func - aggregate function used for sampling to the specified interval + :param method - interpolation function usded to fill missing values + :param show_interpolated - show if row is interpolated? + :return DataFrame + """ + # Validate input parameters + self.__validate_fill(method) + self.__validate_col(tsdf.df, partition_cols, target_cols, ts_col) + + # Only select required columns for interpolation + input_cols: List[str] = [*partition_cols, ts_col, *target_cols] + sampled_input: DataFrame = tsdf.df.select(*input_cols) + + if self.is_resampled is False: + # Resample and Normalize Input + sampled_input: DataFrame = tsdf.resample( + freq=freq, func=func, metricCols=target_cols + ).df + + # Fill timeseries for nearest values + time_series_filled = self.__generate_time_series_fill( + sampled_input, partition_cols, ts_col + ) + + # Generate surrogate timestamps for each target column + # This is required if multuple columns are being interpolated and may contain nulls + add_column_time: DataFrame = time_series_filled + for column in target_cols: + add_column_time = add_column_time.withColumn( + f"event_ts_{column}", + when(col(column).isNull(), None).otherwise(col(ts_col)), + ) + add_column_time = self.__generate_column_time_fill( + add_column_time, partition_cols, ts_col, column + ) + + # Handle edge case if last value (latest) is null + edge_filled = add_column_time.withColumn( + "next_timestamp", + when( + col("next_timestamp").isNull(), expr(f"{ts_col}+ interval {freq}") + ).otherwise(col("next_timestamp")), + ) + + # Fill target column for nearest values + target_column_filled = edge_filled + for column in target_cols: + target_column_filled = self.__generate_target_fill( + target_column_filled, partition_cols, ts_col, column + ) + + # Generate missing timeseries values + exploded_series = target_column_filled.withColumn( + f"new_{ts_col}", + expr( + f"explode(sequence({ts_col}, next_timestamp - interval {freq}, interval {freq} )) as timestamp" + ), + ) + # Mark rows that are interpolated if flag is set to True + flagged_series: DataFrame = exploded_series + + flagged_series = ( + exploded_series.withColumn( + "is_ts_interpolated", + when(col(f"new_{ts_col}") != col(ts_col), True).otherwise(False), + ) + .withColumn(ts_col, col(f"new_{ts_col}")) + .drop(col(f"new_{ts_col}")) + ) + + # # Perform interpolation on each target column + interpolated_result: DataFrame = flagged_series + for target_col in target_cols: + # Interpolate target columns + interpolated_result: DataFrame = self.__interpolate_column( + interpolated_result, ts_col, target_col, method + ) + + interpolated_result = interpolated_result.drop( + f"previous_timestamp_{target_col}", + f"next_timestamp_{target_col}", + f"previous_{target_col}", + f"next_{target_col}", + f"next_null_{target_col}", + f"{ts_col}_{target_col}", + ) + + # Remove non-required columns + output: DataFrame = interpolated_result.drop( + "previous_timestamp", "next_timestamp" + ) + + # Hide is_interpolated columns based on flag + if show_interpolated is False: + interpolated_col_names = ["is_ts_interpolated"] + for column in target_cols: + interpolated_col_names.append(f"is_interpolated_{column}") + output = output.drop(*interpolated_col_names) + + return output diff --git a/python/tempo/resample.py b/python/tempo/resample.py index 3b9c9014..e76f5fd1 100644 --- a/python/tempo/resample.py +++ b/python/tempo/resample.py @@ -114,7 +114,7 @@ def aggregate(tsdf, freq, func, metricCols = None, prefix = None, fill = None): if fill: res = imputes.join(res, tsdf.partitionCols + [tsdf.ts_col], "leftouter").na.fill(0, metrics) - return(tempo.TSDF(res, ts_col = tsdf.ts_col, partition_cols = tsdf.partitionCols)) + return res def checkAllowableFreq(tsdf, freq): diff --git a/python/tempo/tsdf.py b/python/tempo/tsdf.py index 8e86ae06..e4023657 100644 --- a/python/tempo/tsdf.py +++ b/python/tempo/tsdf.py @@ -1,17 +1,19 @@ -from pyspark.sql import SparkSession - import logging from functools import reduce +from typing import List import numpy as np import pyspark.sql.functions as f from IPython.core.display import HTML from IPython.display import display as ipydisplay +from pyspark.sql import SparkSession +from pyspark.sql.dataframe import DataFrame from pyspark.sql.window import Window from scipy.fft import fft, fftfreq import tempo.io as tio import tempo.resample as rs +from tempo.interpol import Interpolation from tempo.utils import ENV_BOOLEAN, PLATFORM logger = logging.getLogger(__name__) @@ -582,8 +584,43 @@ def resample(self, freq, func=None, metricCols = None, prefix=None, fill = None) :return: TSDF object with sample data using aggregate function """ rs.validateFuncExists(func) - enriched_tsdf = rs.aggregate(self, freq, func, metricCols, prefix, fill) - return(enriched_tsdf) + enriched_df:DataFrame = rs.aggregate(self, freq, func, metricCols, prefix, fill) + return (_ResampledTSDF(enriched_df, ts_col = self.ts_col, partition_cols = self.partitionCols, freq = freq, func = func)) + + def interpolate(self, freq: str, func: str, method: str, target_cols: List[str] = None,ts_col: str = None, partition_cols: List[str]=None, show_interpolated:bool = False): + """ + function to interpolate based on frequency, aggregation, and fill similar to pandas. Data will first be aggregated using resample, then missing values + will be filled based on the fill calculation. + + :param freq: frequency for upsample - valid inputs are "hr", "min", "sec" corresponding to hour, minute, or second + :param func: function used to aggregate input + :param method: function used to fill missing values e.g. linear, null, zero, bfill, ffill + :param target_cols [optional]: columns that should be interpolated, by default interpolates all numeric columns + :param ts_col [optional]: specify other ts_col, by default this uses the ts_col within the TSDF object + :param partition_cols [optional]: specify other partition_cols, by default this uses the partition_cols within the TSDF object + :param show_interpolated [optional]: if true will include an additional column to show which rows have been fully interpolated. + :return: new TSDF object containing interpolated data + """ + + # Set defaults for target columns, timestamp column and partition columns when not provided + if ts_col is None: + ts_col = self.ts_col + if partition_cols is None: + partition_cols = self.partitionCols + if target_cols is None: + prohibited_cols: List[str] = partition_cols + [ts_col] + summarizable_types = ['int', 'bigint', 'float', 'double'] + + # get summarizable find summarizable columns + target_cols:List[str] = [datatype[0] for datatype in self.df.dtypes if + ((datatype[1] in summarizable_types) and + (datatype[0].lower() not in prohibited_cols))] + + interpolate_service: Interpolation = Interpolation(is_resampled=False) + tsdf_input = TSDF(self.df, ts_col = ts_col, partition_cols=partition_cols) + interpolated_df:DataFrame = interpolate_service.interpolate(tsdf_input,ts_col, partition_cols,target_cols, freq, func, method, show_interpolated) + + return TSDF(interpolated_df, ts_col = ts_col, partition_cols=partition_cols) def calc_bars(tsdf, freq, func = None, metricCols = None, fill = None): @@ -675,3 +712,45 @@ def tempo_fourier_util(pdf): result = result.drop("tdval", "tpoints") return TSDF(result, self.ts_col, self.partitionCols, self.sequence_col) + + +class _ResampledTSDF(TSDF): + def __init__(self, df, ts_col="event_ts", partition_cols=None, sequence_col = None, freq = None, func = None): + super(_ResampledTSDF, self).__init__(df, ts_col, partition_cols, sequence_col) + self.__freq = freq + self.__func = func + + def interpolate(self, method: str, target_cols: List[str] = None, show_interpolated:bool = False): + """ + function to interpolate based on frequency, aggregation, and fill similar to pandas. This method requires an already sampled data set in order to use. + + :param method: function used to fill missing values e.g. linear, null, zero, bfill, ffill + :param target_cols [optional]: columns that should be interpolated, by default interpolates all numeric columns + :param show_interpolated [optional]: if true will include an additional column to show which rows have been fully interpolated. + :return: new TSDF object containing interpolated data + """ + + # Set defaults for target columns, timestamp column and partition columns when not provided + if target_cols is None: + prohibited_cols: List[str] = self.partitionCols + [self.ts_col] + summarizable_types = ['int', 'bigint', 'float', 'double'] + + # get summarizable find summarizable columns + target_cols:List[str] = [datatype[0] for datatype in self.df.dtypes if + ((datatype[1] in summarizable_types) and + (datatype[0].lower() not in prohibited_cols))] + + interpolate_service: Interpolation = Interpolation(is_resampled=True) + tsdf_input = TSDF(self.df, ts_col = self.ts_col, partition_cols=self.partitionCols) + interpolated_df = interpolate_service.interpolate( + tsdf=tsdf_input, + ts_col=self.ts_col, + partition_cols=self.partitionCols, + target_cols=target_cols, + freq=self.__freq, + func=self.__func, + method=method, + show_interpolated=show_interpolated, + ) + + return TSDF(interpolated_df, ts_col = self.ts_col, partition_cols=self.partitionCols) diff --git a/python/tests/interpol_tests.py b/python/tests/interpol_tests.py new file mode 100644 index 00000000..db262f6e --- /dev/null +++ b/python/tests/interpol_tests.py @@ -0,0 +1,591 @@ +from pyspark.sql.types import * +from tests.tsdf_tests import SparkTest +from tempo.interpol import Interpolation +from chispa.dataframe_comparer import * +from tempo.tsdf import TSDF +from tempo.utils import * +import unittest + + +class InterpolationTest(SparkTest): + def buildTestingDataFrame(self): + schema = StructType( + [ + StructField("partition_a", StringType()), + StructField("partition_b", StringType()), + StructField("event_ts", StringType()), + StructField("value_a", FloatType()), + StructField("value_b", FloatType()), + ] + ) + + self.expected_schema = StructType( + [ + StructField("partition_a", StringType()), + StructField("partition_b", StringType()), + StructField("event_ts", StringType(), False), + StructField("value_a", DoubleType()), + StructField("value_b", DoubleType()), + StructField("is_ts_interpolated", BooleanType(), False), + StructField("is_interpolated_value_a", BooleanType(), False), + StructField("is_interpolated_value_b", BooleanType(), False), + ] + ) + + # TODO: This data set tests with multiple partitions, should still be implemented at some time. + data = [ + ["A", "A-1", "2020-01-01 00:01:10", 349.21, None], + ["A", "A-1", "2020-01-01 00:02:03", None, 4.0], + ["A", "A-2", "2020-01-01 00:01:15", 340.21, 9.0], + ["B", "B-1", "2020-01-01 00:01:15", 362.1, 4.0], + ["A", "A-2", "2020-01-01 00:01:17", 353.32, 8.0], + ["B", "B-2", "2020-01-01 00:02:14", None, 6.0], + ["A", "A-1", "2020-01-01 00:03:02", 351.32, 7.0], + ["B", "B-2", "2020-01-01 00:01:12", 361.1, 5.0], + ] + + simple_data = [ + ["A", "A-1", "2020-01-01 00:00:10", 0.0, None], + ["A", "A-1", "2020-01-01 00:01:10", 2.0, 2.0], + ["A", "A-1", "2020-01-01 00:01:32", None, None], + ["A", "A-1", "2020-01-01 00:02:03", None, None], + ["A", "A-1", "2020-01-01 00:03:32", None, 7.0], + ["A", "A-1", "2020-01-01 00:04:12", 8.0, 8.0], + ["A", "A-1", "2020-01-01 00:05:31", 11.0, None], + ] + + # construct dataframes + self.input_df = self.buildTestDF(schema, data) + self.simple_input_df = self.buildTestDF(schema, simple_data) + + # generate TSDF + self.input_tsdf = TSDF( + self.input_df, + partition_cols=["partition_a", "partition_b"], + ts_col="event_ts", + ) + self.simple_input_tsdf = TSDF( + self.simple_input_df, + partition_cols=["partition_a", "partition_b"], + ts_col="event_ts", + ) + + # register interpolation helper + self.interpolate_helper = Interpolation(is_resampled=False) + + +class InterpolationUnitTest(InterpolationTest): + def test_fill_validation(self): + """Test fill parameter is valid.""" + self.buildTestingDataFrame() + try: + self.interpolate_helper.interpolate( + tsdf=self.input_tsdf, + partition_cols=["partition_a", "partition_b"], + target_cols=["value_a", "value_b"], + freq="30 seconds", + ts_col="event_ts", + func="mean", + method="abcd", + show_interpolated=True, + ) + except ValueError as e: + self.assertEqual(type(e), ValueError) + else: + self.fail("ValueError not raised") + + def test_target_column_validation(self): + """Test target columns exist in schema, and are of the right type (numeric).""" + self.buildTestingDataFrame() + try: + self.interpolate_helper.interpolate( + tsdf=self.input_tsdf, + partition_cols=["partition_a", "partition_b"], + target_cols=["partition_a", "value_b"], + freq="30 seconds", + ts_col="event_ts", + func="mean", + method="zero", + show_interpolated=True, + ) + except ValueError as e: + self.assertEqual(type(e), ValueError) + else: + self.fail("ValueError not raised") + + def test_partition_column_validation(self): + """Test partition columns exist in schema.""" + self.buildTestingDataFrame() + try: + self.interpolate_helper.interpolate( + tsdf=self.input_tsdf, + partition_cols=["partition_c", "partition_b"], + target_cols=["value_a", "value_b"], + freq="30 seconds", + ts_col="event_ts", + func="mean", + method="zero", + show_interpolated=True, + ) + except ValueError as e: + self.assertEqual(type(e), ValueError) + else: + self.fail("ValueError not raised") + + def test_ts_column_validation(self): + """Test time series column exist in schema.""" + self.buildTestingDataFrame() + try: + self.interpolate_helper.interpolate( + tsdf=self.input_tsdf, + partition_cols=["partition_a", "partition_b"], + target_cols=["value_a", "value_b"], + freq="30 seconds", + ts_col="value_a", + func="mean", + method="zero", + show_interpolated=True, + ) + except ValueError as e: + self.assertEqual(type(e), ValueError) + else: + self.fail("ValueError not raised") + + def test_zero_fill_interpolation(self): + """Test zero fill interpolation. + + For zero fill interpolation we expect any missing timeseries values to be generated and filled in with zeroes. + If after sampling there are null values in the target column these will also be filled with zeroes. + + """ + self.buildTestingDataFrame() + + expected_data = [ + ["A", "A-1", "2020-01-01 00:00:00", 0.0, 0.0, False, False, True], + ["A", "A-1", "2020-01-01 00:00:30", 0.0, 0.0, True, True, True], + ["A", "A-1", "2020-01-01 00:01:00", 2.0, 2.0, False, False, False], + ["A", "A-1", "2020-01-01 00:01:30", 0.0, 0.0, False, True, True], + ["A", "A-1", "2020-01-01 00:02:00", 0.0, 0.0, False, True, True], + ["A", "A-1", "2020-01-01 00:02:30", 0.0, 0.0, True, True, True], + ["A", "A-1", "2020-01-01 00:03:00", 0.0, 0.0, True, True, True], + ["A", "A-1", "2020-01-01 00:03:30", 0.0, 7.0, False, True, False], + ["A", "A-1", "2020-01-01 00:04:00", 8.0, 8.0, False, False, False], + ["A", "A-1", "2020-01-01 00:04:30", 0.0, 0.0, True, True, True], + ["A", "A-1", "2020-01-01 00:05:00", 0.0, 0.0, True, True, True], + ["A", "A-1", "2020-01-01 00:05:30", 11.0, 0.0, False, False, True], + ] + + expected_df: DataFrame = self.buildTestDF(self.expected_schema, expected_data) + + actual_df: DataFrame = self.interpolate_helper.interpolate( + tsdf=self.simple_input_tsdf, + partition_cols=["partition_a", "partition_b"], + target_cols=["value_a", "value_b"], + freq="30 seconds", + ts_col="event_ts", + func="mean", + method="zero", + show_interpolated=True, + ) + + assert_df_equality(expected_df, actual_df, ignore_nullable=True) + + def test_null_fill_interpolation(self): + """Test null fill interpolation. + + For null fill interpolation we expect any missing timeseries values to be generated and filled in with nulls. + If after sampling there are null values in the target column these will also be kept as nulls. + + + """ + self.buildTestingDataFrame() + + expected_data = [ + ["A", "A-1", "2020-01-01 00:00:00", 0.0, None, False, False, True], + ["A", "A-1", "2020-01-01 00:00:30", None, None, True, True, True], + ["A", "A-1", "2020-01-01 00:01:00", 2.0, 2.0, False, False, False], + ["A", "A-1", "2020-01-01 00:01:30", None, None, False, True, True], + ["A", "A-1", "2020-01-01 00:02:00", None, None, False, True, True], + ["A", "A-1", "2020-01-01 00:02:30", None, None, True, True, True], + ["A", "A-1", "2020-01-01 00:03:00", None, None, True, True, True], + ["A", "A-1", "2020-01-01 00:03:30", None, 7.0, False, True, False], + ["A", "A-1", "2020-01-01 00:04:00", 8.0, 8.0, False, False, False], + ["A", "A-1", "2020-01-01 00:04:30", None, None, True, True, True], + ["A", "A-1", "2020-01-01 00:05:00", None, None, True, True, True], + ["A", "A-1", "2020-01-01 00:05:30", 11.0, None, False, False, True], + ] + + expected_df: DataFrame = self.buildTestDF(self.expected_schema, expected_data) + + actual_df: DataFrame = self.interpolate_helper.interpolate( + tsdf=self.simple_input_tsdf, + partition_cols=["partition_a", "partition_b"], + target_cols=["value_a", "value_b"], + freq="30 seconds", + ts_col="event_ts", + func="mean", + method="null", + show_interpolated=True, + ) + + assert_df_equality(expected_df, actual_df, ignore_nullable=True) + + def test_back_fill_interpolation(self): + """Test back fill interpolation. + + For back fill interpolation we expect any missing timeseries values to be generated and filled with the nearest subsequent non-null value. + If the right (latest) edge contains is null then preceding interpolated values will be null until the next non-null value. + Pre-existing nulls are treated as the same as missing values, and will be replaced with an interpolated value. + + """ + self.buildTestingDataFrame() + + expected_data = [ + ["A", "A-1", "2020-01-01 00:00:00", 0.0, 2.0, False, False, True], + ["A", "A-1", "2020-01-01 00:00:30", 2.0, 2.0, True, True, True], + ["A", "A-1", "2020-01-01 00:01:00", 2.0, 2.0, False, False, False], + ["A", "A-1", "2020-01-01 00:01:30", 8.0, 7.0, False, True, True], + ["A", "A-1", "2020-01-01 00:02:00", 8.0, 7.0, False, True, True], + ["A", "A-1", "2020-01-01 00:02:30", 8.0, 7.0, True, True, True], + ["A", "A-1", "2020-01-01 00:03:00", 8.0, 7.0, True, True, True], + ["A", "A-1", "2020-01-01 00:03:30", 8.0, 7.0, False, True, False], + ["A", "A-1", "2020-01-01 00:04:00", 8.0, 8.0, False, False, False], + ["A", "A-1", "2020-01-01 00:04:30", 11.0, None, True, True, True], + ["A", "A-1", "2020-01-01 00:05:00", 11.0, None, True, True, True], + ["A", "A-1", "2020-01-01 00:05:30", 11.0, None, False, False, True], + ] + + expected_df: DataFrame = self.buildTestDF(self.expected_schema, expected_data) + + actual_df: DataFrame = self.interpolate_helper.interpolate( + tsdf=self.simple_input_tsdf, + partition_cols=["partition_a", "partition_b"], + target_cols=["value_a", "value_b"], + freq="30 seconds", + ts_col="event_ts", + func="mean", + method="bfill", + show_interpolated=True, + ) + + assert_df_equality(expected_df, actual_df, ignore_nullable=True) + + def test_forward_fill_interpolation(self): + """Test forward fill interpolation. + + For forward fill interpolation we expect any missing timeseries values to be generated and filled with the nearest preceding non-null value. + If the left (earliest) edge is null then subsequent interpolated values will be null until the next non-null value. + Pre-existing nulls are treated as the same as missing values, and will be replaced with an interpolated value. + + """ + self.buildTestingDataFrame() + + expected_data = [ + ["A", "A-1", "2020-01-01 00:00:00", 0.0, None, False, False, True], + ["A", "A-1", "2020-01-01 00:00:30", 0.0, None, True, True, True], + ["A", "A-1", "2020-01-01 00:01:00", 2.0, 2.0, False, False, False], + ["A", "A-1", "2020-01-01 00:01:30", 2.0, 2.0, False, True, True], + ["A", "A-1", "2020-01-01 00:02:00", 2.0, 2.0, False, True, True], + ["A", "A-1", "2020-01-01 00:02:30", 2.0, 2.0, True, True, True], + ["A", "A-1", "2020-01-01 00:03:00", 2.0, 2.0, True, True, True], + ["A", "A-1", "2020-01-01 00:03:30", 2.0, 7.0, False, True, False], + ["A", "A-1", "2020-01-01 00:04:00", 8.0, 8.0, False, False, False], + ["A", "A-1", "2020-01-01 00:04:30", 8.0, 8.0, True, True, True], + ["A", "A-1", "2020-01-01 00:05:00", 8.0, 8.0, True, True, True], + ["A", "A-1", "2020-01-01 00:05:30", 11.0, 8.0, False, False, True], + ] + + expected_df: DataFrame = self.buildTestDF(self.expected_schema, expected_data) + + actual_df: DataFrame = self.interpolate_helper.interpolate( + tsdf=self.simple_input_tsdf, + partition_cols=["partition_a", "partition_b"], + target_cols=["value_a", "value_b"], + freq="30 seconds", + ts_col="event_ts", + func="mean", + method="ffill", + show_interpolated=True, + ) + + assert_df_equality(expected_df, actual_df, ignore_nullable=True) + + def test_linear_fill_interpolation(self): + """Test linear fill interpolation. + + For linear fill interpolation we expect any missing timeseries values to be generated and filled using linear interpolation. + If the right (latest) or left (earliest) edges is null then subsequent interpolated values will be null until the next non-null value. + Pre-existing nulls are treated as the same as missing values, and will be replaced with an interpolated value. + + """ + self.buildTestingDataFrame() + + expected_data = [ + ["A", "A-1", "2020-01-01 00:00:00", 0.0, None, False, False, True], + ["A", "A-1", "2020-01-01 00:00:30", 1.0, None, True, True, True], + ["A", "A-1", "2020-01-01 00:01:00", 2.0, 2.0, False, False, False], + ["A", "A-1", "2020-01-01 00:01:30", 3.0, 3.0, False, True, True], + ["A", "A-1", "2020-01-01 00:02:00", 4.0, 4.0, False, True, True], + ["A", "A-1", "2020-01-01 00:02:30", 5.0, 5.0, True, True, True], + ["A", "A-1", "2020-01-01 00:03:00", 6.0, 6.0, True, True, True], + ["A", "A-1", "2020-01-01 00:03:30", 7.0, 7.0, False, True, False], + ["A", "A-1", "2020-01-01 00:04:00", 8.0, 8.0, False, False, False], + ["A", "A-1", "2020-01-01 00:04:30", 9.0, None, True, True, True], + ["A", "A-1", "2020-01-01 00:05:00", 10.0, None, True, True, True], + ["A", "A-1", "2020-01-01 00:05:30", 11.0, None, False, False, True], + ] + + expected_df: DataFrame = self.buildTestDF(self.expected_schema, expected_data) + + actual_df: DataFrame = self.interpolate_helper.interpolate( + tsdf=self.simple_input_tsdf, + partition_cols=["partition_a", "partition_b"], + target_cols=["value_a", "value_b"], + freq="30 seconds", + ts_col="event_ts", + func="mean", + method="linear", + show_interpolated=True, + ) + + assert_df_equality(expected_df, actual_df, ignore_nullable=True) + + def test_show_interpolated(self): + """Test linear `show_interpolated` flag + + For linear fill interpolation we expect any missing timeseries values to be generated and filled using linear interpolation. + If the right (latest) or left (earliest) edges is null then subsequent interpolated values will be null until the next non-null value. + Pre-existing nulls are treated as the same as missing values, and will be replaced with an interpolated value. + + """ + self.buildTestingDataFrame() + + expected_data = [ + ["A", "A-1", "2020-01-01 00:00:00", 0.0, None], + ["A", "A-1", "2020-01-01 00:00:30", 1.0, None], + ["A", "A-1", "2020-01-01 00:01:00", 2.0, 2.0], + ["A", "A-1", "2020-01-01 00:01:30", 3.0, 3.0], + ["A", "A-1", "2020-01-01 00:02:00", 4.0, 4.0], + ["A", "A-1", "2020-01-01 00:02:30", 5.0, 5.0], + ["A", "A-1", "2020-01-01 00:03:00", 6.0, 6.0], + ["A", "A-1", "2020-01-01 00:03:30", 7.0, 7.0], + ["A", "A-1", "2020-01-01 00:04:00", 8.0, 8.0], + ["A", "A-1", "2020-01-01 00:04:30", 9.0, None], + ["A", "A-1", "2020-01-01 00:05:00", 10.0, None], + ["A", "A-1", "2020-01-01 00:05:30", 11.0, None], + ] + + expected_schema = StructType( + [ + StructField("partition_a", StringType()), + StructField("partition_b", StringType()), + StructField("event_ts", StringType()), + StructField("value_a", DoubleType()), + StructField("value_b", DoubleType()), + ] + ) + + expected_df: DataFrame = self.buildTestDF(expected_schema, expected_data) + + actual_df: DataFrame = self.interpolate_helper.interpolate( + tsdf=self.simple_input_tsdf, + partition_cols=["partition_a", "partition_b"], + target_cols=["value_a", "value_b"], + freq="30 seconds", + ts_col="event_ts", + func="mean", + method="linear", + show_interpolated=False, + ) + + assert_df_equality(expected_df, actual_df, ignore_nullable=True) + + +class InterpolationIntegrationTest(InterpolationTest): + def test_interpolation_using_default_tsdf_params(self): + """ + Verify that interpolate uses the ts_col and partition_col from TSDF if not explicitly specified, + and all columns numeric are automatically interpolated if target_col is not specified. + """ + self.buildTestingDataFrame() + + expected_data = [ + ["A", "A-1", "2020-01-01 00:00:00", 0.0, None], + ["A", "A-1", "2020-01-01 00:00:30", 1.0, None], + ["A", "A-1", "2020-01-01 00:01:00", 2.0, 2.0], + ["A", "A-1", "2020-01-01 00:01:30", 3.0, 3.0], + ["A", "A-1", "2020-01-01 00:02:00", 4.0, 4.0], + ["A", "A-1", "2020-01-01 00:02:30", 5.0, 5.0], + ["A", "A-1", "2020-01-01 00:03:00", 6.0, 6.0], + ["A", "A-1", "2020-01-01 00:03:30", 7.0, 7.0], + ["A", "A-1", "2020-01-01 00:04:00", 8.0, 8.0], + ["A", "A-1", "2020-01-01 00:04:30", 9.0, None], + ["A", "A-1", "2020-01-01 00:05:00", 10.0, None], + ["A", "A-1", "2020-01-01 00:05:30", 11.0, None], + ] + + expected_schema = StructType( + [ + StructField("partition_a", StringType()), + StructField("partition_b", StringType()), + StructField("event_ts", StringType()), + StructField("value_a", DoubleType()), + StructField("value_b", DoubleType()), + ] + ) + + expected_df: DataFrame = self.buildTestDF(expected_schema, expected_data) + + actual_df: DataFrame = self.simple_input_tsdf.interpolate( + freq="30 seconds", func="mean", method="linear" + ).df + + assert_df_equality(expected_df, actual_df, ignore_nullable=True) + + def test_interpolation_using_custom_params(self): + """Verify that by specifying optional paramters it will change the result of the interpolation based on those modified params.""" + self.buildTestingDataFrame() + + expected_data = [ + ["A", "A-1", "2020-01-01 00:00:00", 0.0, False, False], + ["A", "A-1", "2020-01-01 00:00:30", 1.0, True, True], + ["A", "A-1", "2020-01-01 00:01:00", 2.0, False, False], + ["A", "A-1", "2020-01-01 00:01:30", 3.0, False, True], + ["A", "A-1", "2020-01-01 00:02:00", 4.0, False, True], + ["A", "A-1", "2020-01-01 00:02:30", 5.0, True, True], + ["A", "A-1", "2020-01-01 00:03:00", 6.0, True, True], + ["A", "A-1", "2020-01-01 00:03:30", 7.0, False, True], + ["A", "A-1", "2020-01-01 00:04:00", 8.0, False, False], + ["A", "A-1", "2020-01-01 00:04:30", 9.0, True, True], + ["A", "A-1", "2020-01-01 00:05:00", 10.0, True, True], + ["A", "A-1", "2020-01-01 00:05:30", 11.0, False, False], + ] + + expected_schema = StructType( + [ + StructField("partition_a", StringType()), + StructField("partition_b", StringType()), + StructField("event_ts", StringType(), False), + StructField("value_a", DoubleType()), + StructField("is_ts_interpolated", BooleanType(), False), + StructField("is_interpolated_value_a", BooleanType(), False), + ] + ) + + expected_df: DataFrame = self.buildTestDF(expected_schema, expected_data) + + actual_df: DataFrame = self.simple_input_tsdf.interpolate( + ts_col="event_ts", + show_interpolated=True, + partition_cols=["partition_a", "partition_b"], + target_cols=["value_a"], + freq="30 seconds", + func="mean", + method="linear", + ).df + + assert_df_equality(expected_df, actual_df, ignore_nullable=True) + + def test_tsdf_constructor_params_are_updated(self): + """Verify that resulting TSDF class has the correct values for ts_col and partition_col based on the interpolation.""" + self.buildTestingDataFrame() + + actual_tsdf: TSDF = self.simple_input_tsdf.interpolate( + ts_col="event_ts", + show_interpolated=True, + partition_cols=["partition_b"], + target_cols=["value_a"], + freq="30 seconds", + func="mean", + method="linear", + ) + + self.assertEqual(actual_tsdf.ts_col, "event_ts") + self.assertEqual(actual_tsdf.partitionCols, ["partition_b"]) + + def test_interpolation_on_sampled_data(self): + """Verify interpolation can be chained with resample within the TSDF class""" + self.buildTestingDataFrame() + + expected_data = [ + ["A", "A-1", "2020-01-01 00:00:00", 0.0, False, False], + ["A", "A-1", "2020-01-01 00:00:30", 1.0, True, True], + ["A", "A-1", "2020-01-01 00:01:00", 2.0, False, False], + ["A", "A-1", "2020-01-01 00:01:30", 3.0, False, True], + ["A", "A-1", "2020-01-01 00:02:00", 4.0, False, True], + ["A", "A-1", "2020-01-01 00:02:30", 5.0, True, True], + ["A", "A-1", "2020-01-01 00:03:00", 6.0, True, True], + ["A", "A-1", "2020-01-01 00:03:30", 7.0, False, True], + ["A", "A-1", "2020-01-01 00:04:00", 8.0, False, False], + ["A", "A-1", "2020-01-01 00:04:30", 9.0, True, True], + ["A", "A-1", "2020-01-01 00:05:00", 10.0, True, True], + ["A", "A-1", "2020-01-01 00:05:30", 11.0, False, False], + ] + + expected_schema = StructType( + [ + StructField("partition_a", StringType()), + StructField("partition_b", StringType()), + StructField("event_ts", StringType(), False), + StructField("value_a", DoubleType()), + StructField("is_ts_interpolated", BooleanType(), False), + StructField("is_interpolated_value_a", BooleanType(), False), + ] + ) + + expected_df: DataFrame = self.buildTestDF(expected_schema, expected_data) + + actual_df: DataFrame = ( + self.simple_input_tsdf.resample(freq="30 seconds", func="mean", fill=None) + .interpolate( + method="linear", target_cols=["value_a"], show_interpolated=True + ) + .df + ) + + assert_df_equality(expected_df, actual_df, ignore_nullable=True) + + def test_defaults_with_resampled_df(self): + """Verify interpolation can be chained with resample within the TSDF class""" + self.buildTestingDataFrame() + + expected_data = [ + ["A", "A-1", "2020-01-01 00:00:00", 0.0, None], + ["A", "A-1", "2020-01-01 00:00:30", 0.0, None], + ["A", "A-1", "2020-01-01 00:01:00", 2.0, 2.0], + ["A", "A-1", "2020-01-01 00:01:30", 2.0, 2.0], + ["A", "A-1", "2020-01-01 00:02:00", 2.0, 2.0], + ["A", "A-1", "2020-01-01 00:02:30", 2.0, 2.0], + ["A", "A-1", "2020-01-01 00:03:00", 2.0, 2.0], + ["A", "A-1", "2020-01-01 00:03:30", 2.0, 7.0], + ["A", "A-1", "2020-01-01 00:04:00", 8.0, 8.0], + ["A", "A-1", "2020-01-01 00:04:30", 8.0, 8.0], + ["A", "A-1", "2020-01-01 00:05:00", 8.0, 8.0], + ["A", "A-1", "2020-01-01 00:05:30", 11.0, 8.0], + ] + + expected_schema = StructType( + [ + StructField("partition_a", StringType()), + StructField("partition_b", StringType()), + StructField("event_ts", StringType(), False), + StructField("value_a", DoubleType()), + StructField("value_b", DoubleType()) + ] + ) + + expected_df: DataFrame = self.buildTestDF(expected_schema, expected_data) + + actual_df: DataFrame = ( + self.simple_input_tsdf.resample(freq="30 seconds", func="mean", fill=None) + .interpolate( + method="ffill" + ) + .df + ) + + assert_df_equality(expected_df, actual_df, ignore_nullable=True) + +## MAIN +if __name__ == '__main__': + unittest.main() diff --git a/python/tests/tests.py b/python/tests/tsdf_tests.py similarity index 99% rename from python/tests/tests.py rename to python/tests/tsdf_tests.py index 8878d279..09900da6 100644 --- a/python/tests/tests.py +++ b/python/tests/tsdf_tests.py @@ -8,7 +8,6 @@ from tempo.tsdf import TSDF from tempo.utils import * - class SparkTest(unittest.TestCase): ## ## Fixtures @@ -18,6 +17,8 @@ def setUp(self): .config("spark.jars.packages", "io.delta:delta-core_2.12:0.7.0") \ .config("spark.sql.extensions", "io.delta.sql.DeltaSparkSessionExtension") \ .config("spark.sql.catalog.spark_catalog", "org.apache.spark.sql.delta.catalog.DeltaCatalog") \ + .config("spark.driver.extraJavaOptions", "-Dio.netty.tryReflectionSetAccessible=true") \ + .config("spark.executor.extraJavaOptions", "-Dio.netty.tryReflectionSetAccessible=true") \ .master("local") \ .getOrCreate()) self.spark.conf.set("spark.sql.shuffle.partitions", 1) @@ -215,7 +216,6 @@ def test_asof_join(self): # joined dataframe should equal the expected dataframe self.assertDataFramesEqual(joined_df, dfExpected) - noRightPrefixdfExpected = self.buildTestDF(expectedSchemaNoRightPrefix, expected_data, ["left_event_ts", "event_ts"]) self.assertDataFramesEqual(non_prefix_joined_df, noRightPrefixdfExpected) From ddb8135a2e96c2c11af66a166d716290c96afa65 Mon Sep 17 00:00:00 2001 From: Ricardo Portilla Date: Tue, 25 Jan 2022 18:40:22 -0500 Subject: [PATCH 29/39] commiting release file --- python/setup.py | 2 +- python/tests/ffill_data.csv | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 python/tests/ffill_data.csv diff --git a/python/setup.py b/python/setup.py index db722c9b..435d8824 100644 --- a/python/setup.py +++ b/python/setup.py @@ -6,7 +6,7 @@ setuptools.setup( name='dbl-tempo', - version='0.1.2', + version='0.1.3', author='Ricardo Portilla, Tristan Nixon, Max Thone, Sonali Guleria', author_email='labs@databricks.com', description='Spark Time Series Utility Package', diff --git a/python/tests/ffill_data.csv b/python/tests/ffill_data.csv new file mode 100644 index 00000000..de9c0bcf --- /dev/null +++ b/python/tests/ffill_data.csv @@ -0,0 +1,20 @@ +MachineId Timestamp VariableValue VariableName MotorId +ExampleMachine 2021-10-08T18:20:14.000+0000 1.8 rMotorCurrent MFU_527_11_M1 +ExampleMachine 2021-10-08T18:20:19.000+0000 1.7 rMotorCurrent MFU_527_11_M1 +ExampleMachine 2021-10-08T18:20:24.000+0000 1.8 rMotorCurrent MFU_527_11_M1 +ExampleMachine 2021-10-08T18:20:29.000+0000 1.7 rMotorCurrent MFU_527_11_M1 +ExampleMachine 2021-10-08T18:20:34.000+0000 1.8 rMotorCurrent MFU_527_11_M1 +ExampleMachine 2021-10-08T18:20:39.000+0000 1.7 rMotorCurrent MFU_527_11_M1 +ExampleMachine 2021-10-08T18:20:59.000+0000 1.8 rMotorCurrent MFU_527_11_M1 +ExampleMachine 2021-10-08T18:21:04.000+0000 1.7 rMotorCurrent MFU_527_11_M1 +ExampleMachine 2021-10-08T18:21:09.000+0000 1.8 rMotorCurrent MFU_527_11_M1 +ExampleMachine 2021-10-08T18:23:25.000+0000 1.8 rMotorCurrent MFU_527_11_M1 +ExampleMachine 2021-10-08T18:23:30.000+0000 0.0 rMotorCurrent MFU_527_11_M1 +ExampleMachine 2021-10-08T18:23:55.000+0000 1.2 rMotorCurrent MFU_527_11_M1 +ExampleMachine 2021-10-08T18:24:00.000+0000 1.7 rMotorCurrent MFU_527_11_M1 +ExampleMachine 2021-10-08T18:24:10.000+0000 0.0 rMotorCurrent MFU_527_11_M1 +ExampleMachine 2021-10-08T18:21:15.000+0000 1.7 rMotorCurrent MFU_527_11_M1 +ExampleMachine 2021-10-08T18:21:20.000+0000 1.8 rMotorCurrent MFU_527_11_M1 +ExampleMachine 2021-10-08T18:21:25.000+0000 1.7 rMotorCurrent MFU_527_11_M1 +ExampleMachine 2021-10-08T18:24:55.000+0000 1.2 rMotorCurrent MFU_527_11_M1 +ExampleMachine 2021-10-08T18:25:00.000+0000 1.7 rMotorCurrent MFU_527_11_M1 \ No newline at end of file From fbb5519ef80631bd60c9c6111b6b2bbfeef2c76d Mon Sep 17 00:00:00 2001 From: Ricardo Portilla Date: Thu, 27 Jan 2022 10:56:03 -0500 Subject: [PATCH 30/39] removed unused code --- python/README.md | 26 ++------------------------ python/tempo/tsdf.py | 14 +------------- 2 files changed, 3 insertions(+), 37 deletions(-) diff --git a/python/README.md b/python/README.md index 605d23cf..75ff04ff 100644 --- a/python/README.md +++ b/python/README.md @@ -146,29 +146,7 @@ moving_avg = watch_accel_tsdf.withRangeStats("y", rangeBackWindowSecs=600) moving_avg.select('event_ts', 'x', 'y', 'z', 'mean_y').show(10, False) ``` -#### 6 - Anomaly Detection - -First create a local yaml file containing tables you wish to create anomalies for: - -Note: Use `%sh` in Databricks or just run a bash command in your local directory as follows: - -``` -echo """ -table1: -database : "default" -name : "revenue_hourly_2021" -ts_col : "timestamp" -lookback_window : "84600" -mode : "new" -# include any grouping columns or metrics you wish to detect anomalies on -partition_cols : ["winner"] -metrics : ["advertiser_impressions", "publisher_net_revenue"] -""" > ad.yaml -``` - -The code to run to produce the stacked table with anomalies is: - -#### 7 - Fourier Transform +#### 6 - Fourier Transform Method for transforming the time series to frequency domain based on the distinguished data column @@ -183,7 +161,7 @@ ft_df = tsdf.fourier_transform(timestep=1, valueCol="data_col") display(ft_df) ``` -#### 8- Interpolation +#### 7- Interpolation Interpolate a series to fill in missing values using a specified function. The following interpolation methods are supported: - Zero Fill : `zero` diff --git a/python/tempo/tsdf.py b/python/tempo/tsdf.py index e4023657..7a5b60bc 100644 --- a/python/tempo/tsdf.py +++ b/python/tempo/tsdf.py @@ -317,7 +317,7 @@ def asofJoin(self, right_tsdf, left_prefix=None, right_prefix="right", tsPartiti :param skipNulls - whether to skip nulls when joining in values """ - # first block of logic checks whether a standard range join will suffice + # first block of logic checks whether a standard range join will suffice left_df = self.df right_df = right_tsdf.df @@ -336,13 +336,6 @@ def asofJoin(self, right_tsdf, left_prefix=None, right_prefix="right", tsPartiti left_cols = list(set(left_df.columns).difference(set(self.partitionCols))) right_cols = list(set(right_df.columns).difference(set(right_tsdf.partitionCols))) new_left_cols = left_cols - #if left_prefix: - # left_prefix += '_' - #else: - # left_prefix = '' - - #if right_prefix != '': - # right_prefix+= '_' w = Window.partitionBy(*partition_cols).orderBy(right_prefix + right_tsdf.ts_col) new_left_ts_col = left_prefix + self.ts_col @@ -365,11 +358,6 @@ def asofJoin(self, right_tsdf, left_prefix=None, right_prefix="right", tsPartiti left_df = self.df right_df = right_tsdf.df - #if left_prefix: - # left_prefix = left_prefix + '_' - #if right_prefix: - # right_prefix = right_prefix + '_' - # validate timestamp datatypes match self.__validateTsColMatch(right_tsdf) From 784e1d802d99516f6f0ddd12302b0f8f53d5f093 Mon Sep 17 00:00:00 2001 From: Ricardo Portilla Date: Thu, 27 Jan 2022 12:16:46 -0500 Subject: [PATCH 31/39] make the sql opt optional --- python/tempo/tsdf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/tempo/tsdf.py b/python/tempo/tsdf.py index 7a5b60bc..9817b006 100644 --- a/python/tempo/tsdf.py +++ b/python/tempo/tsdf.py @@ -302,7 +302,7 @@ def describe(self): pass - def asofJoin(self, right_tsdf, left_prefix=None, right_prefix="right", tsPartitionVal=None, fraction=0.5, skipNulls=True): + def asofJoin(self, right_tsdf, left_prefix=None, right_prefix="right", tsPartitionVal=None, fraction=0.5, skipNulls=True, sql_join_opt=False): """ Performs an as-of join between two time-series. If a tsPartitionVal is specified, it will do this partitioned by time brackets, which can help alleviate skew. @@ -330,7 +330,7 @@ def asofJoin(self, right_tsdf, left_prefix=None, right_prefix="right", tsPartiti # choose 30MB as the cutoff for the broadcast bytes_threshold = 30*1024*1024 - if (left_bytes < bytes_threshold) | (right_bytes < bytes_threshold): + if sql_join_opt & ((left_bytes < bytes_threshold) | (right_bytes < bytes_threshold)): spark.conf.set("spark.databricks.optimizer.rangeJoin.binSize", 60) partition_cols = right_tsdf.partitionCols left_cols = list(set(left_df.columns).difference(set(self.partitionCols))) From 298886c7443d7dae5142d28703000f5cd821febb Mon Sep 17 00:00:00 2001 From: Ricardo Portilla Date: Fri, 28 Jan 2022 12:08:52 -0500 Subject: [PATCH 32/39] pushing prefix change --- python/tempo/tsdf.py | 1 + 1 file changed, 1 insertion(+) diff --git a/python/tempo/tsdf.py b/python/tempo/tsdf.py index 9817b006..a3a96c27 100644 --- a/python/tempo/tsdf.py +++ b/python/tempo/tsdf.py @@ -338,6 +338,7 @@ def asofJoin(self, right_tsdf, left_prefix=None, right_prefix="right", tsPartiti new_left_cols = left_cols w = Window.partitionBy(*partition_cols).orderBy(right_prefix + right_tsdf.ts_col) + left_prefix = ('' if left_prefix is None else left_prefix + '_') new_left_ts_col = left_prefix + self.ts_col new_left_cols = [f.col(c).alias(left_prefix + c) for c in left_cols] + partition_cols new_right_cols = [f.col(c).alias(right_prefix + c) for c in right_cols] + partition_cols From 77fb53890af5a117070c84df53fc9800e930b7db Mon Sep 17 00:00:00 2001 From: Ricardo Portilla Date: Fri, 28 Jan 2022 15:27:52 -0500 Subject: [PATCH 33/39] pushing prefix change --- python/tempo/tsdf.py | 1 + 1 file changed, 1 insertion(+) diff --git a/python/tempo/tsdf.py b/python/tempo/tsdf.py index a3a96c27..79276d87 100644 --- a/python/tempo/tsdf.py +++ b/python/tempo/tsdf.py @@ -339,6 +339,7 @@ def asofJoin(self, right_tsdf, left_prefix=None, right_prefix="right", tsPartiti w = Window.partitionBy(*partition_cols).orderBy(right_prefix + right_tsdf.ts_col) left_prefix = ('' if left_prefix is None else left_prefix + '_') + right_prefix = ('' if right_prefix is None else right_prefix + '_') new_left_ts_col = left_prefix + self.ts_col new_left_cols = [f.col(c).alias(left_prefix + c) for c in left_cols] + partition_cols new_right_cols = [f.col(c).alias(right_prefix + c) for c in right_cols] + partition_cols From d1b86a3f9e99206db27dfadb7599fc70d0761d1e Mon Sep 17 00:00:00 2001 From: Ricardo Portilla Date: Fri, 28 Jan 2022 15:34:35 -0500 Subject: [PATCH 34/39] pushing prefix change --- python/tempo/tsdf.py | 1 + 1 file changed, 1 insertion(+) diff --git a/python/tempo/tsdf.py b/python/tempo/tsdf.py index 79276d87..add9be82 100644 --- a/python/tempo/tsdf.py +++ b/python/tempo/tsdf.py @@ -341,6 +341,7 @@ def asofJoin(self, right_tsdf, left_prefix=None, right_prefix="right", tsPartiti left_prefix = ('' if left_prefix is None else left_prefix + '_') right_prefix = ('' if right_prefix is None else right_prefix + '_') new_left_ts_col = left_prefix + self.ts_col + new_right_ts_col = right_prefix + self.ts_col new_left_cols = [f.col(c).alias(left_prefix + c) for c in left_cols] + partition_cols new_right_cols = [f.col(c).alias(right_prefix + c) for c in right_cols] + partition_cols quotes_df_w_lag = right_df.select(*new_right_cols).withColumn("lead_" + right_tsdf.ts_col, f.lead(right_prefix + right_tsdf.ts_col).over(w)) From 14a1789a4a6e512b35f932555368d0a01dad9a63 Mon Sep 17 00:00:00 2001 From: Ricardo Portilla Date: Fri, 28 Jan 2022 15:45:34 -0500 Subject: [PATCH 35/39] pushing prefix change --- python/tempo/tsdf.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/python/tempo/tsdf.py b/python/tempo/tsdf.py index add9be82..b5a24eab 100644 --- a/python/tempo/tsdf.py +++ b/python/tempo/tsdf.py @@ -338,17 +338,18 @@ def asofJoin(self, right_tsdf, left_prefix=None, right_prefix="right", tsPartiti new_left_cols = left_cols w = Window.partitionBy(*partition_cols).orderBy(right_prefix + right_tsdf.ts_col) - left_prefix = ('' if left_prefix is None else left_prefix + '_') - right_prefix = ('' if right_prefix is None else right_prefix + '_') + left_prefix = ('' if ((left_prefix is None) | (left_prefix == '')) else left_prefix + '_') + right_prefix = ('' if ((right_prefix is None) | (right_prefix == '')) else right_prefix + '_') new_left_ts_col = left_prefix + self.ts_col new_right_ts_col = right_prefix + self.ts_col new_left_cols = [f.col(c).alias(left_prefix + c) for c in left_cols] + partition_cols new_right_cols = [f.col(c).alias(right_prefix + c) for c in right_cols] + partition_cols quotes_df_w_lag = right_df.select(*new_right_cols).withColumn("lead_" + right_tsdf.ts_col, f.lead(right_prefix + right_tsdf.ts_col).over(w)) - quotes_df_w_lag_tsdf = TSDF(quotes_df_w_lag, partition_cols=right_tsdf.partitionCols, ts_col= right_prefix + right_tsdf.ts_col) + #quotes_df_w_lag_tsdf = TSDF(quotes_df_w_lag, partition_cols=right_tsdf.partitionCols, ts_col= right_prefix + right_tsdf.ts_col) left_df = left_df.select(*new_left_cols) res = left_df.join(quotes_df_w_lag, partition_cols).where(left_df[new_left_ts_col].between(f.col(right_prefix + right_tsdf.ts_col), f.coalesce(f.col('lead_' + right_tsdf.ts_col), f.lit('2099-01-01').cast("timestamp")))).drop('lead_' + right_tsdf.ts_col) return(TSDF(res, partition_cols=self.partitionCols, ts_col=new_left_ts_col)) + # end of block checking to see if standard Spark SQL join will work if (tsPartitionVal is not None): From 34e9748e126ab9d46b82020d041b28038486fe7f Mon Sep 17 00:00:00 2001 From: Ricardo Portilla Date: Fri, 28 Jan 2022 15:50:50 -0500 Subject: [PATCH 36/39] adding files --- .github/workflows/onrelease.yml | 59 +++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 .github/workflows/onrelease.yml diff --git a/.github/workflows/onrelease.yml b/.github/workflows/onrelease.yml new file mode 100644 index 00000000..e95a3880 --- /dev/null +++ b/.github/workflows/onrelease.yml @@ -0,0 +1,59 @@ +name: release + +on: + push: + tags: + - 'v*' # only release a versioned tag, such as v.X.Y.Z + +jobs: + release: + runs-on: ${{ matrix.os }} + strategy: + max-parallel: 1 + matrix: + python-version: [ 3.9 ] + os: [ ubuntu-latest ] + + steps: + - uses: actions/checkout@v1 + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v1 + with: + python-version: ${{ matrix.python-version }} + + - uses: actions/cache@v2 + id: cache + with: + path: ~/.cache/pip + key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }} + restore-keys: | + ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }} + ${{ runner.os }}-pip- + - name: Install pip + run: python -m pip install --upgrade pip + + - name: Install dependencies + run: pip install -U -r dev-requirements.txt + + - name: Build dist + run: python setup.py clean bdist_wheel + + - name: Publish a Python distribution to PyPI + uses: pypa/gh-action-pypi-publish@release/v1 + with: + user: __token__ + password: ${{ secrets.LABS_PYPI_TOKEN }} + + - name: Create Release + id: create_release + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions + with: + tag_name: ${{ github.ref }} + release_name: Release ${{ github.ref }} + body: | + Release for version ${{ github.ref }}. Please refer to CHANGELOG.md for detailed information. + draft: false + prerelease: false \ No newline at end of file From f5d92d9ad9f3a871fd249ebd6b503ad35c021397 Mon Sep 17 00:00:00 2001 From: Ricardo Portilla Date: Fri, 28 Jan 2022 15:56:28 -0500 Subject: [PATCH 37/39] adding files --- python/tempo/tsdf.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/python/tempo/tsdf.py b/python/tempo/tsdf.py index b5a24eab..ef354798 100644 --- a/python/tempo/tsdf.py +++ b/python/tempo/tsdf.py @@ -335,7 +335,6 @@ def asofJoin(self, right_tsdf, left_prefix=None, right_prefix="right", tsPartiti partition_cols = right_tsdf.partitionCols left_cols = list(set(left_df.columns).difference(set(self.partitionCols))) right_cols = list(set(right_df.columns).difference(set(right_tsdf.partitionCols))) - new_left_cols = left_cols w = Window.partitionBy(*partition_cols).orderBy(right_prefix + right_tsdf.ts_col) left_prefix = ('' if ((left_prefix is None) | (left_prefix == '')) else left_prefix + '_') @@ -344,8 +343,8 @@ def asofJoin(self, right_tsdf, left_prefix=None, right_prefix="right", tsPartiti new_right_ts_col = right_prefix + self.ts_col new_left_cols = [f.col(c).alias(left_prefix + c) for c in left_cols] + partition_cols new_right_cols = [f.col(c).alias(right_prefix + c) for c in right_cols] + partition_cols + [print(C) for C in new_right_cols] quotes_df_w_lag = right_df.select(*new_right_cols).withColumn("lead_" + right_tsdf.ts_col, f.lead(right_prefix + right_tsdf.ts_col).over(w)) - #quotes_df_w_lag_tsdf = TSDF(quotes_df_w_lag, partition_cols=right_tsdf.partitionCols, ts_col= right_prefix + right_tsdf.ts_col) left_df = left_df.select(*new_left_cols) res = left_df.join(quotes_df_w_lag, partition_cols).where(left_df[new_left_ts_col].between(f.col(right_prefix + right_tsdf.ts_col), f.coalesce(f.col('lead_' + right_tsdf.ts_col), f.lit('2099-01-01').cast("timestamp")))).drop('lead_' + right_tsdf.ts_col) return(TSDF(res, partition_cols=self.partitionCols, ts_col=new_left_ts_col)) From e4cb60d57c319481efb9520984ff212d7eb31cc7 Mon Sep 17 00:00:00 2001 From: Ricardo Portilla Date: Fri, 28 Jan 2022 16:31:04 -0500 Subject: [PATCH 38/39] adding files --- python/tempo/tsdf.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/python/tempo/tsdf.py b/python/tempo/tsdf.py index ef354798..12640d34 100644 --- a/python/tempo/tsdf.py +++ b/python/tempo/tsdf.py @@ -336,11 +336,12 @@ def asofJoin(self, right_tsdf, left_prefix=None, right_prefix="right", tsPartiti left_cols = list(set(left_df.columns).difference(set(self.partitionCols))) right_cols = list(set(right_df.columns).difference(set(right_tsdf.partitionCols))) - w = Window.partitionBy(*partition_cols).orderBy(right_prefix + right_tsdf.ts_col) left_prefix = ('' if ((left_prefix is None) | (left_prefix == '')) else left_prefix + '_') right_prefix = ('' if ((right_prefix is None) | (right_prefix == '')) else right_prefix + '_') + + w = Window.partitionBy(*partition_cols).orderBy(right_prefix + right_tsdf.ts_col) + new_left_ts_col = left_prefix + self.ts_col - new_right_ts_col = right_prefix + self.ts_col new_left_cols = [f.col(c).alias(left_prefix + c) for c in left_cols] + partition_cols new_right_cols = [f.col(c).alias(right_prefix + c) for c in right_cols] + partition_cols [print(C) for C in new_right_cols] From 0832eebfef1f1c6c8cb1492547fd90bdfc54b1b8 Mon Sep 17 00:00:00 2001 From: Ricardo Portilla Date: Fri, 28 Jan 2022 16:33:34 -0500 Subject: [PATCH 39/39] updating asof prefix logic for sql optimization --- python/tempo/tsdf.py | 1 - 1 file changed, 1 deletion(-) diff --git a/python/tempo/tsdf.py b/python/tempo/tsdf.py index 12640d34..8788d068 100644 --- a/python/tempo/tsdf.py +++ b/python/tempo/tsdf.py @@ -344,7 +344,6 @@ def asofJoin(self, right_tsdf, left_prefix=None, right_prefix="right", tsPartiti new_left_ts_col = left_prefix + self.ts_col new_left_cols = [f.col(c).alias(left_prefix + c) for c in left_cols] + partition_cols new_right_cols = [f.col(c).alias(right_prefix + c) for c in right_cols] + partition_cols - [print(C) for C in new_right_cols] quotes_df_w_lag = right_df.select(*new_right_cols).withColumn("lead_" + right_tsdf.ts_col, f.lead(right_prefix + right_tsdf.ts_col).over(w)) left_df = left_df.select(*new_left_cols) res = left_df.join(quotes_df_w_lag, partition_cols).where(left_df[new_left_ts_col].between(f.col(right_prefix + right_tsdf.ts_col), f.coalesce(f.col('lead_' + right_tsdf.ts_col), f.lit('2099-01-01').cast("timestamp")))).drop('lead_' + right_tsdf.ts_col)