LeonBam
LeonBam

Reputation: 235

read_json on polars causes OutOfSpec error

I have started to evaluate Polars and it looks amazing comparing to Pandas. My case is running data processing tasks on a "medium" size data and for now it looks very promising. However, when reading JSON file causes:

thread '<unnamed>' panicked at 'called `Result::unwrap()` on an `Err` value: OutOfSpec("offsets must not exceed the values length")

The call is:

import polars as pr
pr.read_json('./data/yelp_academic_dataset_review.json', json_lines=True)

The file size is 5.0G, was taken from kaggle Yelp dataset.

I am running on Mac: 16GB, 2.3 GHz Quad-Core Intel Core i7, Polars 0.13.58

What might be the reason? Thanks

Upvotes: 2

Views: 2103

Answers (1)

user18559875
user18559875

Reputation:

Update: Polars >= 0.13.59

As of Polars 0.13.59, this has been fixed. You can now read JSON file with more than 2GB of text in a column, so the workaround below is no longer needed.

And as an added bonus, the JSON parser is now much faster.

The problem

It appears not to be a RAM limitation, nor a malformed input file. Instead, it appears to be a limitation in json_loads with the amount of data being parsed.

I threw my Threadripper Pro (with 512 GB of RAM) at this. If I read the file into RAM:

import polars as pl
from io import StringIO

with open("/tmp/yelp_academic_dataset_review.json") as json_file:
    file_lines = json_file.readlines()

len(file_lines)

We get 6,990,280 lines.

>>> len(file_lines)
6990280

Using binary search, I discovered that reading the first 3,785,593 lines works:

pl.read_json(StringIO("".join(file_lines[0:3_785_593])), json_lines=True)
>>> pl.read_json(StringIO("".join(file_lines[0:3_785_593])), json_lines=True)
shape: (3785593, 9)
┌────────────────────────┬──────┬─────────────────────┬───────┬─────┬───────┬─────────────────────────────────────┬────────┬────────────────────────┐
│ business_id            ┆ cool ┆ date                ┆ funny ┆ ... ┆ stars ┆ text                                ┆ useful ┆ user_id                │
│ ---                    ┆ ---  ┆ ---                 ┆ ---   ┆     ┆ ---   ┆ ---                                 ┆ ---    ┆ ---                    │
│ str                    ┆ i64  ┆ str                 ┆ i64   ┆     ┆ f64   ┆ str                                 ┆ i64    ┆ str                    │
╞════════════════════════╪══════╪═════════════════════╪═══════╪═════╪═══════╪═════════════════════════════════════╪════════╪════════════════════════╡
│ XQfwVwDr-v0ZS3_CbbE5Xw ┆ 0    ┆ 2018-07-07 22:09:11 ┆ 0     ┆ ... ┆ 3.0   ┆ If you decide to eat here, just ... ┆ 0      ┆ mh_-eMZ6K5RLWhZyISBhwA │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 7ATYjTIgM3jUlt4UM3IypQ ┆ 1    ┆ 2012-01-03 15:28:18 ┆ 0     ┆ ... ┆ 5.0   ┆ I've taken a lot of spin classes... ┆ 1      ┆ OyoGAe7OKpv6SyGZT5g77Q │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ YjUWPpI6HXG530lwP-fb2A ┆ 0    ┆ 2014-02-05 20:30:30 ┆ 0     ┆ ... ┆ 3.0   ┆ Family diner. Had the buffet. Ec... ┆ 0      ┆ 8g_iMtfSiwikVnbP2etR0A │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ kxX2SOes4o-D3ZQBkiMRfA ┆ 1    ┆ 2015-01-04 00:01:03 ┆ 0     ┆ ... ┆ 5.0   ┆ Wow!  Yummy, different,  delicio... ┆ 1      ┆ _7bHUi9Uuf5__HHc_Q8guQ │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ ...                    ┆ ...  ┆ ...                 ┆ ...   ┆ ... ┆ ...   ┆ ...                                 ┆ ...    ┆ ...                    │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ EaqASiPkxV9OUkvsAp4ODg ┆ 0    ┆ 2015-03-17 20:48:03 ┆ 0     ┆ ... ┆ 4.0   ┆ Small hole in the wall, yet plen... ┆ 0      ┆ OPZWPj14g2LQnDWJjMioWQ │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ WbCCGpq_XIr-2_jSXISZKQ ┆ 0    ┆ 2015-08-18 23:26:40 ┆ 1     ┆ ... ┆ 3.0   ┆ Easy street access with adequate... ┆ 0      ┆ 1rPlm6liFDqv8oSmuHSefA │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ ld_H5-FpZOWm_tkzwkPYQQ ┆ 0    ┆ 2014-09-25 01:10:49 ┆ 0     ┆ ... ┆ 1.0   ┆ Think twice before staying here.... ┆ 1      ┆ Rz8za5LT_qXBgsL0ice5Qw │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ t0Qyogb4x--K9i5b0AoDCg ┆ 0    ┆ 2017-09-20 14:18:52 ┆ 0     ┆ ... ┆ 5.0   ┆ Reasonably priced, fast friendly... ┆ 0      ┆ uab7_Z8GPeiZ_Un-Jl3fVg │
└────────────────────────┴──────┴─────────────────────┴───────┴─────┴───────┴─────────────────────────────────────┴────────┴────────────────────────┘

But reading one more line, causes the error:

pl.read_json(StringIO("".join(file_lines[0:3_785_594])), json_lines=True)
>>> pl.read_json(StringIO("".join(file_lines[0:3_785_594])), json_lines=True)
thread '<unnamed>' panicked at 'called `Result::unwrap()` on an `Err` value: OutOfSpec("offsets must not exceed the values length")', /github/home/.cargo/git/checkouts/arrow2-8a2ad61d97265680/c720eb2/src/array/growable/utf8.rs:70:14
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/corey/.virtualenvs/StackOverflow3.10/lib/python3.10/site-packages/polars/io.py", line 917, in read_json
    return DataFrame._read_json(source, json_lines)
  File "/home/corey/.virtualenvs/StackOverflow3.10/lib/python3.10/site-packages/polars/internals/frame.py", line 818, in _read_json
    self._df = PyDataFrame.read_json(file, json_lines)
pyo3_runtime.PanicException: called `Result::unwrap()` on an `Err` value: OutOfSpec("offsets must not exceed the values length")

And yet reading a swath of records around that breakpoint reveals nothing particularly wrong or malformed.

pl.read_json(StringIO("".join(file_lines[3_785_592:3_785_595])), json_lines=True)
shape: (3, 9)
┌────────────────────────┬──────┬─────────────────────┬───────┬─────┬───────┬─────────────────────────────────────┬────────┬────────────────────────┐
│ business_id            ┆ cool ┆ date                ┆ funny ┆ ... ┆ stars ┆ text                                ┆ useful ┆ user_id                │
│ ---                    ┆ ---  ┆ ---                 ┆ ---   ┆     ┆ ---   ┆ ---                                 ┆ ---    ┆ ---                    │
│ str                    ┆ i64  ┆ str                 ┆ i64   ┆     ┆ f64   ┆ str                                 ┆ i64    ┆ str                    │
╞════════════════════════╪══════╪═════════════════════╪═══════╪═════╪═══════╪═════════════════════════════════════╪════════╪════════════════════════╡
│ t0Qyogb4x--K9i5b0AoDCg ┆ 0    ┆ 2017-09-20 14:18:52 ┆ 0     ┆ ... ┆ 5.0   ┆ Reasonably priced, fast friendly... ┆ 0      ┆ uab7_Z8GPeiZ_Un-Jl3fVg │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ wEdzUMaLE2ebYoe7Z0XGaA ┆ 0    ┆ 2017-07-18 00:16:16 ┆ 0     ┆ ... ┆ 1.0   ┆ I apologize to the readers of Ye... ┆ 0      ┆ tVkr6-lasqKzafoV5K4JfA │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ ZF0tt7hn6WK3-aNWgtLcFA ┆ 0    ┆ 2016-08-01 22:08:07 ┆ 0     ┆ ... ┆ 5.0   ┆ Great place. Interesting to see ... ┆ 0      ┆ 9XT2LHohnC8v0T1H4Jxs2Q │
└────────────────────────┴──────┴─────────────────────┴───────┴─────┴───────┴─────────────────────────────────────┴────────┴────────────────────────┘

And there's nothing in the input file in that swath that suggest problems, other than a long comment:

head -3785595 yelp_academic_dataset_review.json | tail -3
{"review_id":"kWSOtQvuANZIaCpnb2jNbA","user_id":"uab7_Z8GPeiZ_Un-Jl3fVg","business_id":"t0Qyogb4x--K9i5b0AoDCg","stars":5.0,"useful":0,"funny":0,"cool":0,"text":"Reasonably priced, fast friendly service, delicious Mexican food.  Our go-to place for Mexican takeout in Exton\/Lionville.  They also have tables for dining, you order at the counter.  Exceptional value for high quality fresh food.","date":"2017-09-20 14:18:52"}
{"review_id":"sOOPVuf02-Lz75cTI33KEw","user_id":"tVkr6-lasqKzafoV5K4JfA","business_id":"wEdzUMaLE2ebYoe7Z0XGaA","stars":1.0,"useful":0,"funny":0,"cool":0,"text":"I apologize to the readers of Yelp in advance for the length of this review. However, I felt the need to say what is on my mind. The one star I gave is for the kind and intelligent hostess who needs to be in the manager's position as he does not know how to do his job.  Firstly, this is NOT New York Pizza and the original in Brooklyn should be embarrassed that it bears their namesake. Ordered pizza for pickup. Arrived, got my pizza and went to my car. Opened the box to double check it and it was all sauce, with a very minute amount of \"mozzarella,\" which felt like rubber. I tasted the sauce that was on my finger from when I touched the cheese... horrifically BLAND. What happened next was worse than the bland sauce. I spoke to a very kind hostess, and asked for cheese to be added. She obliged and said they would remake it. The manager, who I see several other people have had issues with, came over and was extremely condescending. He explained that it's because they put sauce on top of the cheese... ok so why was there no cheese under the sauce then either hunny? Why he felt the need to explain to me why my pizza had no cheese is beyond me, especially when the situation had already been rectified. I then asked if that was also why there were burns on the top as well, and he found it amusing and stated \"it's only one burnt bubble...\" (It was waaaay more than one, but ok). Why is ANY PART OF MY FOOD BURNT SIR?! He then felt the need to explain how a coal brick oven works... I'm from Brooklyn, I've had PLENTY of pizza that is cooked this way, like for example, at Grimaldi's in BROOKLYN. When done properly, it doesn't come out BURNT on ANY PART of it. Anyway, I went from wanting cheese to wanting my money back, simply because of the manager's attitude. Which btw my refund was incorrect, but I wanted to leave so badly that I didn't even address that part. THEN he sarcastically offered me a free pizza, after I requested my money back, and when I declined he condescendingly gave me a $25 gift card and his business card. Sweetheart, I wanted cheese not a free meal, which your hostess had already taken care of before your snarky attitude disrupted our peaceful convo, get your life together. This immediately escalated from me allowing this business a chance to create a long time loyal patron and just getting CHEESE, to wanting to never set foot in this place again.  I assume by his smug demeanor that he is accustomed to treating his patrons this way. Anyway, I found a homeless person and gave him the gift card. I can only hope the homeless man wasn't offended by me giving him a gift card for this disgusting place.","date":"2017-07-18 00:16:16"}
{"review_id":"yzgx106UX9OlyBh0tq2G0g","user_id":"9XT2LHohnC8v0T1H4Jxs2Q","business_id":"ZF0tt7hn6WK3-aNWgtLcFA","stars":5.0,"useful":0,"funny":0,"cool":0,"text":"Great place. Interesting to see and learn the history about it. Can get some really cool pictures. Been here a few times and will keep coming back when we're in the area.","date":"2016-08-01 22:08:07"}

Even if I try to cut the file, steering well clear of the those records...

head -3500000 yelp_academic_dataset_review.json > head.json
tail -1000000 yelp_academic_dataset_review.json > tail.json
cat head.json tail.json > try.json

We still get an error from reading 4.5 million records...

>>> pl.read_json('/tmp/try.json', json_lines=True)
thread '<unnamed>' panicked at 'called `Result::unwrap()` on an `Err` value: OutOfSpec("offsets must not exceed the values length")', /github/home/.cargo/git/checkouts/arrow2-8a2ad61d97265680/c720eb2/src/array/growable/utf8.rs:70:14
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/corey/.virtualenvs/StackOverflow3.10/lib/python3.10/site-packages/polars/io.py", line 917, in read_json
    return DataFrame._read_json(source, json_lines)
  File "/home/corey/.virtualenvs/StackOverflow3.10/lib/python3.10/site-packages/polars/internals/frame.py", line 818, in _read_json
    self._df = PyDataFrame.read_json(file, json_lines)
pyo3_runtime.PanicException: called `Result::unwrap()` on an `Err` value: OutOfSpec("offsets must not exceed the values length")

Workaround

If you cut the input file into smaller slices, use read_json on the smaller slices, and concatenate the result, you'll get your DataFrame.

I'll simulate that on my machine as follows. (You can cut your file into larger pieces than 1 million records. I just chose that as an easy number.)

import polars as pl
from io import StringIO

with open("/tmp/yelp_academic_dataset_review.json") as json_file:
    file_lines = json_file.readlines()

slice_size = 1_000_000
df = pl.concat(
    [
        pl.read_json(
            StringIO("".join(file_lines[offset: (offset + slice_size)])),
            json_lines=True,
        )
        for offset in range(0, len(file_lines), slice_size)
    ]
)
df
shape: (6990280, 9)
┌────────────────────────┬──────┬─────────────────────┬───────┬─────┬───────┬─────────────────────────────────────┬────────┬────────────────────────┐
│ business_id            ┆ cool ┆ date                ┆ funny ┆ ... ┆ stars ┆ text                                ┆ useful ┆ user_id                │
│ ---                    ┆ ---  ┆ ---                 ┆ ---   ┆     ┆ ---   ┆ ---                                 ┆ ---    ┆ ---                    │
│ str                    ┆ i64  ┆ str                 ┆ i64   ┆     ┆ f64   ┆ str                                 ┆ i64    ┆ str                    │
╞════════════════════════╪══════╪═════════════════════╪═══════╪═════╪═══════╪═════════════════════════════════════╪════════╪════════════════════════╡
│ XQfwVwDr-v0ZS3_CbbE5Xw ┆ 0    ┆ 2018-07-07 22:09:11 ┆ 0     ┆ ... ┆ 3.0   ┆ If you decide to eat here, just ... ┆ 0      ┆ mh_-eMZ6K5RLWhZyISBhwA │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 7ATYjTIgM3jUlt4UM3IypQ ┆ 1    ┆ 2012-01-03 15:28:18 ┆ 0     ┆ ... ┆ 5.0   ┆ I've taken a lot of spin classes... ┆ 1      ┆ OyoGAe7OKpv6SyGZT5g77Q │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ YjUWPpI6HXG530lwP-fb2A ┆ 0    ┆ 2014-02-05 20:30:30 ┆ 0     ┆ ... ┆ 3.0   ┆ Family diner. Had the buffet. Ec... ┆ 0      ┆ 8g_iMtfSiwikVnbP2etR0A │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ kxX2SOes4o-D3ZQBkiMRfA ┆ 1    ┆ 2015-01-04 00:01:03 ┆ 0     ┆ ... ┆ 5.0   ┆ Wow!  Yummy, different,  delicio... ┆ 1      ┆ _7bHUi9Uuf5__HHc_Q8guQ │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ ...                    ┆ ...  ┆ ...                 ┆ ...   ┆ ... ┆ ...   ┆ ...                                 ┆ ...    ┆ ...                    │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 2vLksaMmSEcGbjI5gywpZA ┆ 2    ┆ 2021-03-31 16:55:10 ┆ 1     ┆ ... ┆ 5.0   ┆ This spot offers a great, afford... ┆ 2      ┆ Zo0th2m8Ez4gLSbHftiQvg │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ R1khUUxidqfaJmcpmGd4aw ┆ 0    ┆ 2019-12-30 03:56:30 ┆ 0     ┆ ... ┆ 4.0   ┆ This Home Depot won me over when... ┆ 1      ┆ mm6E4FbCMwJmb7kPDZ5v2Q │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ Rr9kKArrMhSLVE9a53q-aA ┆ 0    ┆ 2022-01-19 18:59:27 ┆ 0     ┆ ... ┆ 5.0   ┆ For when I'm feeling like ignori... ┆ 1      ┆ YwAMC-jvZ1fvEUum6QkEkw │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ VAeEXLbEcI9Emt9KGYq9aA ┆ 7    ┆ 2018-01-02 22:50:47 ┆ 3     ┆ ... ┆ 3.0   ┆ Located in the 'Walking District... ┆ 10     ┆ 6JehEvdoCvZPJ_XIxnzIIw │
└────────────────────────┴──────┴─────────────────────┴───────┴─────┴───────┴─────────────────────────────────────┴────────┴────────────────────────┘

Upvotes: 3

Related Questions