Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 14 additions & 53 deletions mapreduce/mapreduce-python.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -132,64 +132,25 @@
" a database such as Redshift or RDS\n",
"\n",
" Note: requires the chars \"[ ]\" to be stripped prior to input\n",
" Returns the converted datetime annd timezone\n",
" or None for both values if failed\n",
"\n",
" TODO: Needs to combine timezone with date as one field\n",
" Returns (date, date_time, time_zone) as strings, or raises\n",
" ValueError if the input cannot be parsed.\n",
" \"\"\"\n",
" date_time = None\n",
" time_zone_parsed = None\n",
"\n",
" # TODO: Probably cleaner to parse this with a regex\n",
" date_parsed = raw_date_time_zone[:raw_date_time_zone.find(\":\")]\n",
" time_parsed = raw_date_time_zone[raw_date_time_zone.find(\":\") + 1:\n",
" raw_date_time_zone.find(\"+\") - 1]\n",
" time_zone_parsed = raw_date_time_zone[raw_date_time_zone.find(\"+\"):]\n",
"\n",
" try:\n",
" date_parsed = raw_date_time_zone[:raw_date_time_zone.find(\":\")]\n",
" time_parsed = raw_date_time_zone[raw_date_time_zone.find(\":\") + 1:\n",
" raw_date_time_zone.find(\"+\") - 1]\n",
" time_zone_parsed = raw_date_time_zone[raw_date_time_zone.find(\"+\"):]\n",
"\n",
" date_struct = time.strptime(date_parsed, \"%d/%b/%Y\")\n",
" converted_date = time.strftime(\"%Y-%m-%d\", date_struct)\n",
" date_time = converted_date + \" \" + time_parsed\n",
"\n",
" # Throws a ValueError exception if the operation fails that is\n",
" # caught by the calling function and is handled appropriately\n",
" except ValueError as error:\n",
" raise ValueError(error)\n",
" else:\n",
" return converted_date, date_time, time_zone_parsed\n",
"\n",
" def mapper(self, _, line):\n",
" line = line.strip()\n",
" match = self.logpat.search(line)\n",
"\n",
" date_time = None\n",
" requester = None\n",
" user_agent = None\n",
" operation = None\n",
"\n",
" try:\n",
" for n in range(self.NUM_ENTRIES_PER_LINE):\n",
" group = match.group(1 + n)\n",
"\n",
" if n == self.S3_LOG_DATE_TIME:\n",
" date, date_time, time_zone_parsed = \\\n",
" self.clean_date_time_zone(group)\n",
" # Leave the following line of code if \n",
" # you want to aggregate by date\n",
" date_time = date + \" 00:00:00\"\n",
" elif n == self.S3_LOG_REQUESTER_ID:\n",
" requester = group\n",
" elif n == self.S3_LOG_USER_AGENT:\n",
" user_agent = group\n",
" elif n == self.S3_LOG_OPERATION:\n",
" operation = group\n",
" else:\n",
" pass\n",
"\n",
" except Exception:\n",
" yield ((\"Error while parsing line: %s\", line), 1)\n",
" else:\n",
" yield ((date_time, requester, user_agent, operation), 1)\n",
" except (ValueError, IndexError) as e:\n",
" raise ValueError(\n",
" f\"Unable to parse date/time/zone from: {raw_date_time_zone!r}\"\n",
" ) from e\n",
"\n",
" def reducer(self, key, values):\n",
" output = list(key)\n",
Expand Down Expand Up @@ -428,9 +389,9 @@
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"display_name": "Python 3",
"language": "python",
"name": "python2"
"name": "python3"
},
"language_info": {
"codemirror_mode": {
Expand All @@ -442,7 +403,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.10"
"version": "3.11.9"
}
},
"nbformat": 4,
Expand Down